使用Python测试端口是否正在使用的快速方法

ttcibm8c  于 2023-08-02  发布在  Python
关注(0)|答案(7)|浏览(89)

我有一个Python服务器,它监听几个套接字。在启动时,我尝试在侦听之前连接到这些套接字,这样我就可以确保没有其他东西已经在使用该端口。这增加了大约3秒的启动时间(不进行测试的话大约是0.54秒),我想把它缩短。由于我只测试localhost,我认为大约50毫秒的超时时间已经足够了。不幸的是,socket.setdefaulttimeout(50)方法由于某种原因似乎不起作用。
我怎么能把它剪下来呢?

ftf50wuq

ftf50wuq1#

要检查端口用途:

def is_port_in_use(port: int) -> bool:
    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

**注意:**connect_ex仍然可以引发异常(如果主机名不正确,请参见[1]上的文档)。

[1][https://docs.python.org/3/library/socket.html](https://docs.python.org/3/library/socket.html)的

vuktfyat

vuktfyat2#

下面是如何检查端口是否被占用的示例。

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()

字符串

t1rydlwq

t1rydlwq3#

如果只尝试绑定到您想要的端口,并在端口被占用时处理错误情况,怎么样?(如果问题是您可能会启动相同的服务两次,则不要查看打开的端口。
正如@eemz在另一个回答中所说,这也是避免造成竞争条件的合理方法。

yvgpqqbh

yvgpqqbh4#

Simon B的回答是正确的--不要检查任何东西,只要尝试绑定并处理错误情况(如果它已经在使用中)。
否则,您将处于竞争状态,其他应用程序可以在您检查端口是否可用以及随后尝试绑定到它之间**获取端口。这意味着您仍然必须处理bind调用失败的可能性,因此提前检查没有任何效果。

rta7y2nd

rta7y2nd5#

您使用的是Linux?如果是这样的话,也许您的应用程序可以运行netstat -lant(如果您使用UDP,则为netstat -lanu)并查看哪些端口正在使用。这样应该更快......

jaxagkaj

jaxagkaj6#

检查端口是否正在使用的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

字符串
检查here for python 3

rbpvctlc

rbpvctlc7#

检查可用/已用端口

def check_port(port):
    import socket, errno
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    try:        
        s.bind(("127.0.0.1", port))
    except socket.error as e:
        if e.errno == errno.EADDRINUSE:
            print("Port is already in use", port)
        else:
            print(e)
            print(f"****Port: {port} cannot be acessed****")
            return False
    s.close()
    return True

# Check port open for range of ports
for i in range (10000):
    check_port(i)

字符串

相关问题