socket.bind在循环中不会引发错误,但不会引发错误

时间:2015-12-01 23:33:15

标签: python sockets networking

如果绑定调用处于循环中,我会得到不同的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)

0 个答案:

没有答案