在Python中验证本地端口是否可用

3

我有一个项目,在该项目中我会生成子进程,子进程需要绑定端口号。端口号由我的Python脚本分配,我只是简单地获取49152到65535之间的任意端口号。

我想要验证该端口是否可用,并且没有被本地系统(*nix)上的其他工具使用。

另一个问题获取了以下代码段:

import socket;
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
result = sock.connect_ex(('127.0.0.1',80))
if result == 0:
   print "Port is open"
else:
   print "Port is not open"

我能在这种情况下使用吗?这不会打开一个端口并且不关闭它以供进一步使用吗?


1
可能是On localhost, how to pick a free port number?的重复问题。 - undefined
@TessellatingHeckler 这确实非常相似,但我只想查看随机端口是否可用。Python脚本本身实际上不应使用它。 - undefined
1
这种方法本质上容易失败,因为在检查和实际使用之间存在竞争条件 - 如果与此同时有其他人窃取了该端口,那该怎么办? - undefined
2个回答

5

只需创建一个临时套接字,然后尝试绑定到该端口以查看其是否可用。在验证端口可用后关闭套接字。

def tryPort(port):
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    result = False
    try:
        sock.bind(("0.0.0.0", port))
        result = True
    except:
        print("Port is in use")
    sock.close()
    return result

2
你可以使用上下文管理器吗?with closing socket(... - undefined

1

代码没问题,它创建了一个套接字并尝试连接。它不会打开或关闭任何端口。你只需要在最后添加这一行来关闭套接字:sock.close()


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接