在Linux中如何查找开放的端口?

4

有没有一种系统调用可以返回端口是否可用?或者至少有一种常规方法可以做到这一点,而不会使进程成为不良公民?

目前我是这样做的:

def find_open_port(min_port, max_port):
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    for port in range(min_port, max_port):
        if port > max_port:
            raise IOError('Could not find a free port between {0} and {1}'.format(min_port, max_port))
        try:
            s.bind(('localhost', port))
            return port
        except socket.error as error:
            if error.strerror == 'Address already in use':
                continue
            else:
                raise error

呸!

1
请查看以下链接:https://dev59.com/4XE85IYBdhLWcg3wUBuz - avasal
你是想要确定Linux中的端口是否开放,还是需要用Python来实现? - Jack Leow
总的来说,我只是使用Python,因为它的socket库接近底层。 - Cera
解析netstat的输出怎么样? - Ottavio Campana
考虑到这一点,但端口未被使用并不意味着用户有权限绑定该端口。 - Cera
1个回答

12

我所知道的检查特定端口是否可用的最简单方法是尝试绑定它或尝试连接它(如果您需要TCP)。如果绑定(或连接)成功,则该端口可用(正在使用)。

但是,如果您只想要 任何 开放的端口,可以绑定到端口0,操作系统会为您分配一个端口。


行,这个方法可行。操作系统会以某种方式告诉我它分配给我的端口吗? - Cera
2
当然可以,使用socket.getsockname() - Greg Hewgill

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