работая на Mac с двумя экземплярами причала, я пришел к этой специфической ситуации:
~$ lsof -ni :9905
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
java 40320 ******* 394u IPv6 0xf5e143eb9100c205 0t0 TCP *:9905 (LISTEN)
java 40325 ******* 302u IPv6 0xf5e143eb79be9005 0t0 TCP 127.0.0.1:9905 (LISTEN)
Я пытался воссоздать эту ситуацию на python, но это не удалось (как я чувствую, это должно быть):
>>> s = socket.socket()
>>> s.bind(("",12345))
>>> s.listen(1)
>>> z = socket.socket()
>>> z.bind(("localhost",12345))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/socket.py", line 224, in meth
return getattr(self._sock,name)(*args)
socket.error: [Errno 48] Address already in use
Я также пробовал с AF_INET6 с теми же результатами.
Кто-нибудь знает, что здесь происходит? как это вообще может произойти? У меня создалось впечатление, что звездочка привязана ко ВСЕМ адресам ... если это действительно нормальное поведение, то как правильно, зачем воссоздавать его в python?
Спасибо!
Вот как это воспроизвести на osx. Понятия не имею, почему это работает (никому не говорите, я пытаюсь выдать себя за парня из Linux), в Linux это не так.
Видеть https://stackoverflow.com/questions/14388706/socket-options-so-reuseaddr-and-so-reuseport-how-do-they-differ-do-they-mean-t для подробных объяснений по розеткам
>>> import socket
>>> s=socket.socket()
>>> s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
>>> s.bind(("",12345))
>>> s.listen(1)
>>> z=socket.socket()
>>> z.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
>>> z.bind(("127.0.0.1",12345))
>>> z.listen(1)
И лсоф
Python 7501 danb 3u IPv4 0xac5d4de7add842f 0t0 TCP *:12345 (LISTEN)
Python 7501 danb 4u IPv4 0xac5d4de7bb7928f 0t0 TCP 127.0.0.1:12345 (LISTEN)