2010-12-16 71 views
69

在我的Python套接字程序中,我有时需要用Ctrl-C来中断它。当我这样做时,它会使用socket.close()关闭连接。Python [Errno 98]地址已经在使用

但是,当我尝试重新打开它时,我必须等待看起来像是一分钟之后才能再次连接。如何正确关闭套接字?或者这是打算?

回答

92

是的,它的目的是。在这里您可以阅读detailed explanation。可以通过在套接字上设置SO_REUSEADDR选项来覆盖此行为。例如:

sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 
+0

奇怪。我在绑定之前调用了它,并且错误仍在发生。我必须在其他地方犯错。 – byxor 2017-02-08 10:25:02

+0

没关系,当我的自动化测试重复绑定并关闭单独的线程时,我遇到了一个奇怪的竞争条件。 – byxor 2017-02-08 14:16:12

12

如果你的SocketServer模块中使用TCPSERVER,UDPServer或它们的子类,你可以把这个类变量(instanciating服务器之前):

SocketServer.TCPServer.allow_reuse_address = True 

(通过SocketServer.ThreadingTCPServer - Cannot bind to address after program restart

这导致INIT(构造器),用于:

if self.allow_reuse_address: 
    self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 
11

- > ps -fA | grep的蟒蛇

501 81211 12368 0下午10点11 ttys000 0:03.12
蟒蛇-m SimpleHTTPServer

- >杀81211

+1

不是最好的答案,但它的工作:) – MartinH 2016-11-21 21:09:52

+0

不幸的是,它并不总是工作。当我遇到这个问题时,这是我的直接想法,但在我的情况下,没有python进程可以杀死。 – Kryten 2016-12-18 05:14:30

2

没有什么工作对我来说,除了运行此命令的子进程,HttpServer的调用之前(( '',443),将myHandler):

杀-9 $(lsof的-ti TCP:443)

当然这只是针对类似Linux的操作系统!

相关问题