2011-02-12 3 views
1

포트에서 수신 대기하는 작은 TCP 서버가 있습니다. 디버깅하는 동안 서버를 CTRL-C로 눌러 프로세스를 종료하는 것이 일반적입니다.Windows와 Linux에서 bind()와 "사용중인 주소"의 차이 - errno = 98

Windows에서 서비스를 신속하게 다시 시작할 수 있으며 소켓을 리바운드 할 수 있습니다. 리눅스에서는 bind()가 성공으로 돌아 오기 전에 몇 분을 기다려야한다.

bind()가 실패하면 errno = 98, address가 사용 중이다.

구현의 차이점을 더 잘 이해하고 싶습니다. Windows는 개발자들에게 더 친숙하지만, Linux는 '잘못된 것'을하고 있습니다.

가능한 모든 클라이언트가 새 소켓이 만들어지기 전에 기존 소켓이 손상된 것을 감지 할 때까지 Linux가 기다리고 있습니다. 이 작업을 수행하는 유일한 방법은 시간 초과가 될 때까지 기다리는 것입니다.

Linux에서 개발하는 동안이 동작을 변경하는 방법이 있습니까? Windows가 수행하는 방식을 복제하려고합니다.

답변

3

Linux의 소켓에서 SO_REUSEADDR 옵션을 사용하려고합니다. 관련 맨 페이지는 socket(7)입니다. 사용 방법은 example입니다. This question은 어떻게되는지 설명합니다.

Here's이 답변이 중복되었습니다.

Linux에서는 SO_REUSEADDR을 사용하면 활성 연결이없는 경우 주소에 바인딩 할 수 있습니다. Windows에서는 이것이 기본 동작입니다. Windows에서 SO_REUSEADDR을 사용하면 여러 소켓을 동일한 주소에 추가로 바인딩 할 수 있습니다. 자세한 내용은 herehere을 참조하십시오.

+0

어쨌든 감사합니다. SO_REUSEADDR을 (를) 찾지 못했습니다. 이제는 정보가 풍부 해졌습니다. 감사! – stuck