如果绑定调用处于循环中,我会得到不同的socket.bind()行为,并且不明白为什么会这样。例如:
>>> af, socktype, proto = 10, 1, 6
>>> for i in xrange(2):
... sock = socket.socket(af, socktype, proto)
... sock.bind(('5.9.109.188', 0))
...
>>>
>>> sock = socket.socket(af, socktype, proto)
>>> sock.bind(('5.9.109.188', 0))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.7/socket.py", line 228, in meth
return getattr(self._sock,name)(*args)
socket.error: [Errno 99] Cannot assign requested address
当它不在循环中时引发的异常是我期望的行为,因为套接字族是10(AF_INET6)但是我尝试绑定的源地址是2(AF_INET)。
我在bind source找不到任何理由。
对于它的价值,背景是我使用socket.create_connection(source)并且它循环遍历getaddrinfo在循环内调用bind的结果,并且应该(如果我理解正确)当源地址不合适时失败,继续下一组结果。相反,因为这不会在循环中失败,所以即使我已经指定了IPv4源地址,我也会得到一个IPv6套接字。
这是Debian上的Python 2.7.10(测试/拉伸):
$ python
Python 2.7.10+ (default, Oct 10 2015, 09:11:24)
[GCC 5.2.1 20151003] on linux2
通过aptitude安装:
ii python2.7 2.7.10-5 amd64 Interactive high-level object-oriented language (version 2.7)