2009-02-23 1 views
13

Я использовал SO_REUSEADDR, чтобы мой сервер, который был завершен, чтобы перезапустить, не жалуясь, что сокет уже используется. Мне было интересно, есть ли другие варианты использования SO_REUSEADDR? Кто-нибудь использовал опцию сокета за исключением указанной цели?Использование SO_REUSEADDR?

+2

Спасибо, мне было интересно то же самое. Связанный вопрос: почему SO_REUSEADDR не используется по умолчанию? – 2009-02-23 15:33:03

ответ

20

Для TCP: основной целью является перезапуск закрытого/убитого процесса по тому же адресу.

Флаг необходим, потому что порт переходит в состояние TIME_WAIT, чтобы обеспечить передачу всех данных.

Если два сокета связаны с одним интерфейсом и портом и являются членами одной и той же группы многоадресной передачи, данные будут доставлены в оба гнезда.

Я предполагаю, что альтернативное использование будет атакой безопасности, чтобы попытаться перехватить данные.

(Source)


Для UDP: SO_REUSEADDR используется для многоадресной рассылки

Более чем один процесс может связываться с же порт SOCK_DGRAM UDP, если Bind() является которому предшествуют:

int one = 1; setsockopt (носок, SOL_SOCKET, SO_REUSEADDR, & один, SizeOf (один))

В этом случае каждый входящие многоадресный или широковещательный UDP-дейтаграмма суждено общий порт доставляются всем розеток, связанных с портом ,

(Source)

+2

Требуется уточнение. Порт прослушивания не входит в TIME_WAIT, но принятые соединения могут. TIME_WAIT не существует, чтобы обеспечить передачу всех данных, чтобы избежать путаницы с последующим соединением между теми же конечными точками. – EJP

+0

Является ли связывание на стороне отправителя или стороне приемника (для UDP: SO_REUSEADDR)? Что произойдет, если отправитель и получатель являются отдельными узлами в сети? – Sammy

5

Другое основное использование, чтобы позволить тройники к bind() одному и тому же порту UDP. Возможно, вы не думаете, что это произойдет, но иногда несколько приложений могут прослушивать широковещательные/многоадресные адреса с заданным номером порта. Он также позволяет привязываться к подстановочному адресу, а также привязывать к определенному адресу. Например, Apache может связываться с *: 80 и 10.11.12.13:80