Использование SO_REUSEADDR - Что происходит с ранее открытым сокетом? - PullRequest
27 голосов
/ 22 апреля 2009

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

Мой вопрос: что происходит со старым сокетом? Без сомнения, все данные / соединения все равно будут получены на старом сокете. ОС закрывается автоматически?

Ответы [ 2 ]

29 голосов
/ 22 апреля 2009

Сокет считается закрытым, когда программа, использующая его, умирает. Это многое обрабатывается ОС, и ОС откажется принимать любое дальнейшее сообщение из мертвого разговора. Однако, если сокет был неожиданно закрыт, компьютер на другом конце может не знать, что разговор окончен, и все еще может пытаться установить связь.

Именно поэтому в спецификации TCP предусмотрен период ожидания до повторного использования того же номера порта. Поскольку теоретически, однако маловероятно, возможно, что пакет из старого диалога может прибыть с соответствующим IP-адресом, номерами портов и порядковыми номерами, так что принимающий сервер по ошибке ошибочно вставит его в неправильный поток TCP.

Параметр SO_REUSEADDR отменяет это поведение, позволяя вам немедленно повторно использовать порт. По сути, вы говорите: «Я понимаю риски и все равно хотел бы использовать порт».

24 голосов
/ 22 апреля 2009

Да, ОС автоматически закрывает предыдущий сокет, когда старый процесс завершается. Причина, по которой вы не можете прослушивать один и тот же порт сразу же, заключается в том, что сокет, хотя и закрыт, остается в состоянии 2MSL в течение некоторого времени (обычно несколько минут). ОС автоматически переводит старый сокет из этого состояния по истечении времени ожидания.

...