7

我正在使用一些看起来像这样的 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 发生了什么?我是否能够再次使用此端口而无需重新启动机器?

4

3 回答 3

1

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

于 2013-10-17T06:02:56.930 回答
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
于 2013-11-25T12:48:08.223 回答
0

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

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

您也可以尝试 strace 您的程序。

于 2013-11-05T08:21:08.133 回答