每个套接字地址通常只允许使用一次(但我需要使用相同的端口…)

2024-04-28 03:38:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在编写一个(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
>>> 

感谢您的回复!在


Tags: 端口ip服务器comsoconnectgooglesocket
2条回答

关于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

如果我有错,请你纠正我。在

圣诞快乐!在

相关问题 更多 >