Python套接字库认为套接字是打开的

时间:2013-10-16 20:01:08

标签: python linux sockets networking

我正在使用一些看起来像这样的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处理程序关闭套接字连接,因此我不确定它是如何进入该状态的,但是现在我只是想修复它。

lsofnetstat都说使用该端口没有任何内容:

[$]> sudo netstat -an | grep 43434
[$]> sudo lsof -i :43434
根据{{​​1}},

TIME_WAIT设置为60秒,但错误发生在上次成功运行后数小时。

我已尝试(暂时)设置/proc/sys/net/ipv4/tcp_fin_timeout(通过REUSEADDR),但似乎没有效果。

目前正在进行什么?我是否能够再次使用此端口而无需重启机器?

3 个答案:

答案 0 :(得分:1)

试试这个:
tcpkill -i eth0 port 43434

答案 1 :(得分:1)

我想添加评论,但不会让我这样做。所以我必须这样回答。根据我的经验,我必须做以下事情以获得套接字才能取得成功。我必须自己明确设置超时。

在打开套接字之前的代码中,如果您使用的是python 2.3或更高版本,则应该设置它。我通常以30秒的超时开始,然后将其调整为适用于特定网站的内容。当我不使用这个参数时,我会得到一些问题。

socket.setdefaulttimeout(timeout)

我在开放后所做的其他问题包括以下一些例外情况:

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

答案 2 :(得分:0)

您可以尝试设置SO_REUSEPORT套接字选项。 HOwever,只有在冲突的套接字在绑定之前设置了SO_REUSEPORT选项时才有效,因此您应该在干净重启后尝试。

但是,你说你的python代码看起来像你发布的代码。您是否真的尝试过非常简化的程序版本来仅测试绑定?

您也可以尝试操作程序。