Все должны согласиться с SO_REUSEADDR? - PullRequest
1 голос
/ 14 декабря 2011

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

У меня две разные программы, использующие один и тот же порт, и мне любопытно, как работает механизм - для того, чтобы программа 2 для выделения порта программа 1 только что закрыла, нужно ли им обеим указывать SO_REUSEADDR после они создают сокет?

Или этого достаточно для одного из них? Если это так, тот, кто первым берет сокет, или тот, кто пытается открыть его позже, когда он задерживается в состоянии TIME_WAIT?

Вот небольшой пример в Python, который, надеюсь, прояснит ситуацию;

# one.py
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind(("", 5050)) # Assuming 5050 is available
sys.exit(1)        # Assuming s enters TIME_WAIT

# two.py
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind(("", 5050))
s.listen()

Представьте one.py и two.py как две отдельные кодовые базы.

Нужно ли для one.py и two.py установить параметр сокета SO_REUSEADDR, чтобы two.py мог выдержать длительный сокет TIME_WAIT из one.py?

Спасибо.

Ответы [ 3 ]

5 голосов
/ 22 сентября 2012

Чтобы ответить на ваш вопрос.Я считаю, что в Linux вы должны указать SO_REUSEADDR ONLY в программе, которая хочет повторно использовать порт.Очень просто.В Microsoft Windows, однако, это другая история.У Microsoft есть страница на MSDN , которая охватывает SO_REUSEADDR и связанные с ней функции.

0 голосов
/ 14 декабря 2011

Системный вызов для прослушивающих сокетов - bind(), и вы не можете привязать к одному и тому же порту один и тот же адрес (-ы) в одно и то же время: ОС запрещает это. SO_REUSEADDR говорит, что другие сокеты могут прослушивать после выхода из программы. Но пока он не вышел, он является собственностью этого порта.

0 голосов
/ 14 декабря 2011

Я думаю, что да, все программы, использующие один и тот же порт, должны использовать SO_REUSEADDR.

Потому что тайм-аут для повторного использования портов - вещь ядра.

(но я могу ошибаться).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...