Каковы варианты использования SO_REUSEADDR? - PullRequest
15 голосов
/ 23 февраля 2009

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

Ответы [ 2 ]

25 голосов
/ 23 февраля 2009

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

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

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

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

( Источник )


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

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

int one = 1;
setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));

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

( Источник )

7 голосов
/ 23 февраля 2009

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

...