2009-02-23 6 views
13

나는 SO_REUSEADDR을 사용하여 소켓이 이미 사용 중이라는 불평없이 다시 시작된 서버를 가지고 있습니다. SO_REUSEADDR의 다른 용도가 있는지 궁금 해서요? 상기 목적 이외의 목적으로 소켓 옵션을 사용한 사람이 있습니까?SO_REUSEADDR의 용도는 무엇입니까?

+2

감사합니다. 정확하게 똑같은 것이 궁금합니다. 관련 질문 : SO_REUSEADDR이 기본값이 아닌 이유는 무엇입니까? –

답변

20

TCP의 경우 : 주된 목적은 동일한 주소에서 폐쇄/종료 프로세스를 다시 시작하는 것입니다.

모든 데이터가 전송되도록 포트가 TIME_WAIT 상태가되기 때문에 플래그가 필요합니다.

두 개의 소켓이 동일한 인터페이스와 포트에 바인딩되어 있고 동일한 멀티 캐스트 그룹의 구성원 인 경우 데이터가 두 소켓에 전달됩니다.

데이터를 가로 채기 위해 보안 공격을 사용하는 것이 좋습니다.

(Source) UDP 용


: SO_REUSEADDR는 임) (둘 이상의 프로세스가 동일한 SOCK_DGRAM UDP 포트 경우 바인드 결합 수 캐스트

에 사용 앞에 :

int one = 1; setsockopt를 (양말 SOL_SOCKET, SO_REUSEADDR, & 하나 를 sizeof (일)) 이때

는 로 향하는 모든 들어오는 캐스트 또는 브로드 캐스트 UDP 데이터 그램은 공유 포트는 포트에 바인딩 된 모든 소켓에 전달 .

(Source)

+2

설명이 필요합니다. 청취 포트가 TIME_WAIT (으)로 이동하지 않지만 연결을 허용 할 수 있습니다. TIME_WAIT에는 모든 데이터가 전송되는지 확인할 필요가 없으므로 같은 끝점 간의 후속 연결과의 혼동을 피할 수 있습니다. – EJP

+0

발신자 쪽에서 '바인딩'이 발생 했습니까, 아니면 수신자 측에서 (UDP의 경우 SO_REUSEADDR) 일어나고 있습니까? 보낸 사람과받는 사람이 네트워크상의 별도 노드 일 경우 어떻게됩니까? – Sammy

5

다른 주요 용도는 UDP의 동일한 포트 bind() 여러 소켓을 허용하는 것이다. 그럴 것이라고 생각하지 않을 수도 있지만 때로는 여러 개의 앱이 주어진 포트 번호로 브로드 캐스트/멀티 캐스트 주소로 수신하기를 원할 수도 있습니다. 또한 특정 주소에 바인딩하는 동안 와일드 카드 주소에 바인드 할 수 있습니다. 예를 들어, Apache는 * : 80 및 10.11.12.13:80에 바인딩 할 수 있습니다.

관련 문제