我有一个可以监听几个套接字的python服务器。在启动时,我尝试在侦听之前连接到这些套接字,因此我可以确定没有其他任何东西已经在使用该端口。这增加了我的服务器启动大约三秒钟(没有测试大约.54秒),我想减少它。由于我只测试localhost,我认为大约50毫秒的超时时间就足够了。不幸的是,socket.setdefaulttimeout(50)方法由于某种原因似乎不起作用。
我如何减少它?
答案 0 :(得分:11)
以下是如何检查端口是否被占用的示例。
import socket, errno
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 == errno.EADDRINUSE:
print("Port is already in use")
else:
# something else raised the socket.error exception
print(e)
s.close()
答案 1 :(得分:9)
如何尝试绑定到您想要的端口,并在端口被占用时处理错误情况? (如果问题是您可能会启动相同的服务两次,那么请不要查看开放端口。)
这也是避免引起竞争条件的合理方式,正如@eemz在另一个答案中所说的那样。
答案 2 :(得分:8)
要检查端口使用情况:
def is_port_in_use(port):
import socket
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
return s.connect_ex(('localhost', port)) == 0
来源:https://codereview.stackexchange.com/questions/116450/find-available-ports-on-localhost
答案 3 :(得分:1)
你在Linux上吗?如果是这样,也许您的应用程序可以运行netstat -lant
(或netstat -lanu
如果您正在使用UDP)并查看正在使用的端口。这应该更快......
答案 4 :(得分:1)
Simon B的答案是要走的路 - 不要检查任何东西,只是尝试绑定并处理错误情况,如果它已经在使用中。
否则你处于竞争状态,其他一些应用程序可以抓住之间的端口你的支票是免费的以及你后来尝试绑定它。这意味着你仍然需要处理你的bind调用失败的可能性,所以提前检查没有任何结果。
答案 5 :(得分:0)
以下是Mox的答案的实现,对我有用:
import subprocess
port = 5000
print(len(subprocess.Popen("netstat -lant | awk '{print $4}' | grep 0.0.0.0:" + str(port), shell=True, stdout=subprocess.PIPE).stdout.read()) > 0)
答案 6 :(得分:0)
用于检查端口是否在使用中的 Python 2 代码
# python 2
import socket
def check_port(port):
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
res = sock.connect_ex(('localhost', port))
sock.close()
return res == 0