我正在编写一个(NAT遍历)脚本,得到以下错误。 在stackoverflow上我读到,这是因为SO-u-REUSEADDR只丢弃了运行了套接字的端口上的等待时间。当您试图在重用的端口上连接到同一个地址(ip+端口)时,这也没有帮助。 (对于NAT遍历,您需要使用同一个端口来知道NAT提供给您的外部端口)。在
有没有办法反复连接到同一个端口上的同一个ip+端口?
不幸的是,我不能使用UDP,因为我只能访问运行在TCP上的apache学校服务器(可能服务器在NAT之后,只有它的80个端口转发)。在
简化代码(我,我不连接谷歌,但连接到我的学校服务器):
>>> sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
>>> sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
>>> sock.bind(('',6000))
>>> sock.connect(('google.com',80))
>>> sock.shutdown(socket.SHUT_RDWR)
>>> sock.close()
>>> sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
>>> sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
>>> sock.bind(('',6000))
>>> sock.connect(('google.com',80))
Traceback (most recent call last):
File "<pyshell#64>", line 1, in <module>
sock.connect(('google.com',80))
File "C:\Python27\lib\socket.py", line 224, in meth
return getattr(self._sock,name)(*args)
error: [Errno 10048] Only one usage of each socket address (protocol/network address/port) is normally permitted
>>>
感谢您的回复!在
关于socket.SO_重用ADDR重新使用本地端口是好的,但是时间的保护等待从以前的源获取不一致的消息是存在的,内核不允许你连接到上一个源。在
看看这篇文章bind address
你有一个解决办法。它被称为
socket.SO_LINGER
,它通过向目的地发送RST(reset)包来强制关闭连接。它可能无法送达,但没有人关心学校服务器。它可能会有一些问题,比如服务器可以发送一些东西(延迟或者服务器没有接收到第一个数据包),而我的计算机会认为它来自现在挂起的连接。但我想它不会像我发帖子那样发送任何信息,所以我不期待任何东西。 网上有一些关于这个主题的材料,例如http://www.serverframework.com/asynchronousevents/2011/01/time-wait-and-its-design-implications-for-protocols-and-scalable-servers.html如果我有错,请你纠正我。在
圣诞快乐!在
相关问题 更多 >
编程相关推荐