Python 套接字库认为套接字在未打开时已打开
Posted
技术标签:
【中文标题】Python 套接字库认为套接字在未打开时已打开【英文标题】:Python socket library thinks socket is open when it's not 【发布时间】:2013-10-25 02:43:40 【问题描述】:我正在使用一些看起来像这样的 Python:
HOST = '127.0.0.1'
PORT = 43434
single = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
single.bind((HOST, PORT))
except socket.error as e:
# Print an error, exit.
虽然它过去运行良好,但我们现在收到错误 [Errno 98] Address already in use
。 SIGINT 处理程序关闭套接字连接,所以我不确定它是如何进入该状态的,但现在我只是试图修复它。
lsof
和 netstat
都表示没有使用该端口:
[$]> sudo netstat -an | grep 43434
[$]> sudo lsof -i :43434
TIME_WAIT
设置为 60 秒,根据/proc/sys/net/ipv4/tcp_fin_timeout
,但在上次成功运行几小时后仍会出现错误。
我尝试(暂时)设置REUSEADDR
(通过single.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
),但这似乎没有效果。
tarnation 发生了什么?我是否能够再次使用此端口而无需重新启动机器?
【问题讨论】:
您在拨打bind
之前是否拨打过setsockopt
?
@WaleedKhan 是的;它就在try
之前。
【参考方案1】:
试试这个: tcpkill -i eth0 端口 43434
【讨论】:
运行 tcpkill(在 dsniff 包中,顺便说一句),只是挂在tcpkill: listening on eth0 [port 43434]
上。我尝试用-9
运行它,同样的事情。
我也尝试使用cxkill
,它报告该端口上没有连接。我正在尝试使用cutter
,但there are problems 让它在 CentOS 上运行。【参考方案2】:
我想添加评论,但它不允许我这样做。所以我必须这样回答。根据我的经验,我必须执行以下操作才能使套接字成功。我必须自己明确设置超时。
在您打开套接字之前的代码中,如果您使用的是 python 2.3 或更高版本,则应设置此项。我通常从 30 秒的超时开始,然后将其调整为适用于特定网站的内容。当我不使用此参数时,我会遇到问题。
socket.setdefaulttimeout(timeout)
我在open之后做的其他问题是catch了以下一些异常:
except socket.gaierror, err:
# you might want to handle this
except socket.sslerror, err2:
# you might want to handle this if doing SSL
【讨论】:
【参考方案3】:您可以尝试设置SO_REUSEPORT
套接字选项。然而,它只有在冲突的套接字在绑定之前也设置了 SO_REUSEPORT 选项时才有效,因此您应该在干净重启后尝试。
但是,您说您的 python 代码看起来像您发布的代码。您是否真的尝试过非常简化的程序版本来仅测试绑定?
您也可以尝试 strace 程序。
【讨论】:
以上是关于Python 套接字库认为套接字在未打开时已打开的主要内容,如果未能解决你的问题,请参考以下文章
Python:使用套接字库创建的 IRC 机器人返回错误“错误文件描述符”
win 10 UAP/UWP(通用应用程序)的异步套接字库?