Использование SO_REUSEADDR?

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

Ответы

Ответ 1

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

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

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

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

(Источник)


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

Более одного процесса могут связываться с тот же SOP_DGRAM UDP-порт, если bind() предшествует:

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

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

(Источник)

Ответ 2

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