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

我正在处理一些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处理程序closures套接字连接,所以我不确定它是如何得到这种状态,但现在我只是想解决它。

lsofnetstat都说没有使用该端口:

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

根据/proc/sys/net/ipv4/tcp_fin_timeoutTIME_WAIT被设置为60秒,但是在最后一次运行成功之后甚至几个小时都会发生错误。

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

什么在tarnation是怎么回事? 我能够再次使用这个端口而不必重新启动机器吗?

Solutions Collecting From Web of "Python套接字库认为套接字是不是打开"

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

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

 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 

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

你可以尝试设置SO_REUSEPORT套接字选项。 HOwever,只有在冲突的套接字在被绑定之前设置了SO_REUSEPORT选项的情况下才能正常工作,所以你应该在干净的重启之后尝试。

不过,你说你的Python代码看起来像你发布的代码。 你真的尝试过一个非常简化版本的程序来测试绑定吗?

您也可以尝试对程序进行调整。