2010-03-18 48 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() 
相关问题