关于linux:Python套接字库认为套接字是打开的,当它不是时

Python socket library thinks socket is open when it's not

我正在使用一个类似这样的Python:

1
2
3
4
5
6
7
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处理程序关闭了套接字连接,所以我不确定它是如何进入这种状态的,但现在我只是在尝试修复它。

lsofnetstat都表示没有使用该端口:

1
2
[$]> sudo netstat -an | grep 43434
[$]> sudo lsof -i :43434

根据/proc/sys/net/ipv4/tcp_fin_timeout的规定,TIME_WAIT设置为60秒,但错误甚至在上次成功运行数小时后发生。

我试过(暂时)设置REUSEADDR(通过single.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)),但似乎没有效果。

停机坪发生了什么?我是否可以再次使用此端口而不必重新启动计算机?


我想添加一个评论,但它不允许我这样做。所以我必须这样回答。根据我的经验,我必须做以下工作才能使插座工作成功。我必须自己明确设置超时。

在打开套接字之前的代码中,如果您使用的是Python2.3或更高版本,则应设置此项。我通常从30秒的超时开始,然后将其调到特定网站的工作状态。当我不使用此参数时,会出现片状问题。

1
socket.setdefaulttimeout(timeout)

我在公开赛之后做的其他问题是捕获以下一些例外:

1
2
3
4
            except socket.gaierror, err:
                # you might want to handle this
            except socket.sslerror, err2:
                # you might want to handle this if doing SSL

试试这个:
tcpkill-i eth0端口43434


您可以尝试设置SO_REUSEPORT套接字选项。但是,只有当冲突的套接字在绑定之前也设置了sou reuseport选项时,它才起作用,因此您应该在干净的重新启动之后尝试。

但是,您说您的python代码看起来像您发布的代码。您是否尝试过一个非常简单的程序版本来只测试绑定?

你也可以尝试偏离你的计划。