我有一个在几个套接字上侦听的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
也许它不会抛出一个错误,直到你尝试聆听() –