在本地主机上,如何选择一个空闲的端口号?

216 投票
5 回答
194738 浏览
提问于 2025-04-15 14:00

我正在尝试进行进程间通信,因为我搞不懂在Windows下如何使用命名管道,所以我想用网络套接字来实现。所有操作都是在本地进行的。服务器可以启动一些子进程,并在某个端口上监听。子进程完成工作后,会把结果提交给主进程。我该如何找出哪个端口是可用的呢?我想我不能在80或21端口上监听,对吧?

我在用Python,如果这能缩小选择范围的话。

5 个回答

50

把这个插座(socket)绑定到端口0。这样的话,系统会自动从1024到65535之间选一个空闲的端口给你用。你可以在调用完bind()之后,使用getsockname()来获取被选中的端口号。

102

为了方便大家理解上面那些小伙伴们的解释,这里给出一个代码片段:

import socket
from contextlib import closing

def find_free_port():
    with closing(socket.socket(socket.AF_INET, socket.SOCK_STREAM)) as s:
        s.bind(('', 0))
        s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        return s.getsockname()[1]
303

不要绑定到一个特定的端口。相反,绑定到端口0:

import socket
sock = socket.socket()
sock.bind(('', 0))
sock.getsockname()[1]

这样操作系统会为你选择一个可用的端口。你可以通过 sock.getsockname()[1] 来获取被选择的端口,并把它传递给其他需要连接的程序。

sock 是你创建的套接字,由 socket.socket 返回。

撰写回答