2010-12-16 92 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的操作系統!

相關問題