2010-03-18 34 views
4

我有一個在幾個套接字上偵聽的python服務器。在啓動時,我嘗試在收聽之前連接到這些套接字,所以我可以確定沒有其他東西已經在使用該端口。這爲我的服務器的啓動增加了大約三秒鐘的時間(大約0.54秒沒有測試),我想修剪它。由於我只測試本地主機,我認爲大約50毫秒的超時比這足夠了。不幸的是,由於某種原因,socket.setdefaulttimeout(50)方法似乎不起作用。使用Python測試端口是否正在使用的快速方法

我該如何修剪?

回答

7

只是試圖綁定到你想要的端口,並處理錯誤的情況下,如果端口被佔用? (如果問題是你可能啓動兩次相同的服務,那麼不要看開放端口。)

+3

這當然是最有意義的,但當我將同一個端口綁定兩次時,我無法得到所發生的錯誤。 – directedition

+0

也許它不會拋出一個錯誤,直到你嘗試聆聽() –

1

你在Linux上嗎?如果是這樣,也許你的應用程序可以運行netstat -lant(或者如果你使用的是UDP,則爲netstat -lanu)並查看哪些端口正在使用。這應該是更快...

+0

:::測試:::'netstat'似乎在Vista上工作正常,做同樣的事情。 – Brian

0

西蒙B的答案是要走的路 - 不檢查任何東西,只是嘗試綁定和處理錯誤的情況下,如果它已經在使用。

否則,您處於競爭狀態,其中一些其他應用可以在之間抓取端口,您檢查它是免費的,並且您隨後嘗試綁定它。這意味着你仍然必須處理你的綁定調用失敗的可能性,所以提前檢查沒有任何結果。

4

以下是如何檢查端口是否被採用的示例。

import socket 

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 

try: 
    s.bind(("127.0.0.1", 5555)) 
except socket.error as e: 
    if e.errno == 98: 
     print("Port is already in use") 
    else: 
     # something else raised the socket.error exception 
     print(e) 

s.close() 
相關問題