2009-03-03 142 views
6

我最近一直在學習python,並且剛開始使用python的socket庫進行網絡連接。直到最近,當我的腳本終止而沒有關閉連接時,一切都進行得很順利。下一次我跑了劇本,我得到:Python端口綁定

File "./alert_server.py", line 9, in <module> 
    s.bind((HOST, PORT)) 
File "<string>", line 1, in bind 
socket.error: (98, 'Address already in use') 

如此看來,事情仍綁定到該端口,即使python腳本不運行(我已經使用$px aux驗證了這一點什麼。奇怪的是,一分鐘左右後,我可以在同一個端口再次運行腳本,它會沒事的。是否有任何方法來防止/解除端口,以便在將來發生這種情況?

回答

14

你想要什麼要做的就是在bind之前,做:

s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 

您看到您所處行爲的原因是操作系統在最後一次連接終止後的一段時間內保留了該特定端口。這樣可以正確地丟棄應用程序終止後可能進入的任何雜散的數據包。

通過設置SO_REUSEADDR套接字選項,您告訴操作系統,您知道自己在做什麼,並且仍然希望綁定到相同的端口。

+1

此外,您可能需要在套接字上調用shutdown()和close()。 – 2009-03-03 23:09:20