Все обсуждения, которые я видел на 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?
Спасибо.