在Mac上运行两个docker实例我已经到达这个奇特的情况:
~$ 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中重新创build这种情况,但失败了(因为我觉得它应该):
>>> 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中重新创build它的正确性是什么?
谢谢!
这是如何在OSX上重现它。 不知道为什么它的工作(不要告诉任何人,我试图摆出一个Linux的家伙),在Linux上它不。
>>> 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)
和lsof
Python 7501 danb 3u IPv4 0xac5d4de7add842f 0t0 TCP *:12345 (LISTEN) Python 7501 danb 4u IPv4 0xac5d4de7bb7928f 0t0 TCP 127.0.0.1:12345 (LISTEN)