我有一個在幾個套接字上偵聽的python服務器。在啓動時,我嘗試在收聽之前連接到這些套接字,所以我可以確定沒有其他東西已經在使用該端口。這爲我的服務器的啓動增加了大約三秒鐘的時間(大約0.54秒沒有測試),我想修剪它。由於我只測試本地主機,我認爲大約50毫秒的超時比這足夠了。不幸的是,由於某種原因,socket.setdefaulttimeout(50)方法似乎不起作用。使用Python測試端口是否正在使用的快速方法
我該如何修剪?
我有一個在幾個套接字上偵聽的python服務器。在啓動時,我嘗試在收聽之前連接到這些套接字,所以我可以確定沒有其他東西已經在使用該端口。這爲我的服務器的啓動增加了大約三秒鐘的時間(大約0.54秒沒有測試),我想修剪它。由於我只測試本地主機,我認爲大約50毫秒的超時比這足夠了。不幸的是,由於某種原因,socket.setdefaulttimeout(50)方法似乎不起作用。使用Python測試端口是否正在使用的快速方法
我該如何修剪?
只是試圖綁定到你想要的端口,並處理錯誤的情況下,如果端口被佔用? (如果問題是你可能啓動兩次相同的服務,那麼不要看開放端口。)
你在Linux上嗎?如果是這樣,也許你的應用程序可以運行netstat -lant
(或者如果你使用的是UDP,則爲netstat -lanu
)並查看哪些端口正在使用。這應該是更快...
:::測試:::'netstat'似乎在Vista上工作正常,做同樣的事情。 – Brian
西蒙B的答案是要走的路 - 不檢查任何東西,只是嘗試綁定和處理錯誤的情況下,如果它已經在使用。
否則,您處於競爭狀態,其中一些其他應用可以在之間抓取端口,您檢查它是免費的,並且您隨後嘗試綁定它。這意味着你仍然必須處理你的綁定調用失敗的可能性,所以提前檢查沒有任何結果。
以下是如何檢查端口是否被採用的示例。
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()
這當然是最有意義的,但當我將同一個端口綁定兩次時,我無法得到所發生的錯誤。 – directedition
也許它不會拋出一個錯誤,直到你嘗試聆聽() –