如何closures一个死亡程序打开的sockets?

我有一个Python应用程序,它打开一个简单的TCP套接字与另一个主机上的另一个Python应用程序通信。 有时程序会出错,或者我会直接杀死它,在任何情况下,套接字可能会在未知的时间被打开。

下一次我去运行程序,我得到这个错误:

socket.error: [Errno 98] Address already in use 

现在程序总是试图使用相同的端口,所以它看起来好像还是开放的。 我查了一下,很确定程序没有在后台运行,但我的地址仍在使用中。

所以,我怎么手动(或以其他方式)closures套接字/地址,以便我的程序可以立即重新使用它?

更新

根据迈克的回答,我检查了socket(7)页面,看着SO_REUSEADDR:

 SO_REUSEADDR Indicates that the rules used in validating addresses supplied in a bind(2) call should allow reuse of local addresses. For AF_INET sockets this means that a socket may bind, except when there is an active listening socket bound to the address. When the listen‐ ing socket is bound to INADDR_ANY with a specific port then it is not possible to bind to this port for any local address. Argument is an integer boolean flag. 

Solutions Collecting From Web of "如何closures一个死亡程序打开的sockets?"

假设你的套接字被命名为s …你需要在服务器套接字上设置socket.SO_REUSEADDR然后绑定到一个接口…这将允许你立即重新启动一个TCP服务器…

 s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) s.bind((ADDR, PORT)) 

您可能想尝试使用Twisted进行联网。 Mike给出了正确的低级答案SO_REUSEADDR ,但他没有提到这不是在Windows上设置的一个很好的选择。 这是Twisted自动处理的事情。 这种无聊的底层细节有许多很多其他的例子,当你直接使用socket模块时你必须注意,但是如果你使用像Twisted这样的更高层次的库,你可能会忘记它。

你正在混淆套接字,连接和端口。 套接字是连接的端点,它又是5元组(协议,本地IP,本地端口,远程IP,远程端口)。 杀死的程序的套接字已经被操作系统关闭了,同样的连接。 连接的唯一遗迹是对等体的套接字和对等主机上的对应端口。 所以你真正应该问的是如何重用本地端口。 根据其他答案,答案是SO_REUSEADDR。