在localhost上,如何选择一个空闲端口号?

时间:2009-09-02 00:07:14

标签: python sockets ipc port

我正在尝试使用进程间通信,因为我无法弄清楚如何在Windows下使用命名管道,我以为我会使用网络套接字。一切都在当地发生。服务器能够在单独的进程中启动从属服务器并侦听某个端口。奴隶完成他们的工作并将结果提交给主人。我如何确定哪个端口可用?我想我不能在端口80或21上听?

我正在使用Python,如果这会减少选择。

谢谢!

5 个答案:

答案 0 :(得分:203)

不要绑定到特定端口,也不要绑定到端口0,例如sock.bind(('', 0))。操作系统将为您选择一个可用的端口。您可以使用sock.getsockname()[1]获取所选的端口,并将其传递给从属设备,以便它们可以连接回来。

答案 1 :(得分:37)

将套接字绑定到端口0.将选择1024到65535之间的随机空闲端口。您可以在getsockname()之后立即使用bind()检索所选端口。

答案 2 :(得分:32)

为了上述人员解释的片段:

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]

答案 3 :(得分:2)

你可以听任何你想要的端口;通常,用户应用程序应该侦听1024及以上的端口(通过65535)。如果您拥有可变数量的侦听器,那么主要的事情是为您的应用分配一个范围 - 例如20000-21000,以及 CATCH EXCEPTIONS 。这就是您将如何知道您的计算机上的端口是否不可用(换句话说,由另一个进程使用)。

但是,在您的情况下,只要在绑定失败时打印错误消息,就不应该为侦听器使用单个硬编码端口时出现问题。

另请注意,大多数套接字(对于从属服务器)不需要显式绑定到特定端口号 - 只有等待传入连接的套接字(如此处的主服务器)才需要成为监听器并绑定到一个港口。如果在使用套接字之前没有为套接字指定端口,则操作系统将为套接字分配一个可用端口。当主设备想要响应发送数据的从设备时,当监听器接收数据时,可以访问发送方的地址。

我认为你会使用UDP吗?

答案 4 :(得分:0)

根据我的经验,只需选择一个您认为不太可能被其他任何东西使用的相对较高的数字(介于1024-65535之间)。例如,端口#8080和#5555是我通常使用的端口。只需选择一个这样的端口号,而不是让代码随机选择它,然后以后再查找该端口号对我来说就容易多了。

例如,在我当前的ChatBot项目中:

instanceof