Python 在本地主机上,如何选择空闲端口号?
我正在尝试处理进程间通信,因为我不知道如何在Windows下使用命名管道,所以我想我将使用网络套接字。一切都发生在当地。服务器能够在单独的进程中启动从属服务器,并侦听某些端口。奴隶们做他们的工作并将结果提交给主人。如何确定哪个端口可用?我想我不能监听端口80或21Python 在本地主机上,如何选择空闲端口号?,python,sockets,ipc,port,Python,Sockets,Ipc,Port,我正在尝试处理进程间通信,因为我不知道如何在Windows下使用命名管道,所以我想我将使用网络套接字。一切都发生在当地。服务器能够在单独的进程中启动从属服务器,并侦听某些端口。奴隶们做他们的工作并将结果提交给主人。如何确定哪个端口可用?我想我不能监听端口80或21 我正在使用Python,如果这样可以减少选择的话。将套接字绑定到端口0。将选择1024到65535之间的随机空闲端口。您可以在bind()之后立即使用getsockname()检索所选端口,您可以在任何需要的端口上侦听;通常,用户应用
我正在使用Python,如果这样可以减少选择的话。将套接字绑定到端口0。将选择1024到65535之间的随机空闲端口。您可以在
bind()
之后立即使用getsockname()
检索所选端口,您可以在任何需要的端口上侦听;通常,用户应用程序应侦听端口1024及以上(通过65535)。如果你有一个可变数量的监听器,最主要的是为你的应用程序分配一个范围——比如20000-21000,并捕捉异常。这就是您如何知道您的计算机上的端口是否不可用(换句话说,被另一个进程使用)
但是,在您的情况下,只要在绑定失败时打印一条错误消息,就可以为侦听器使用一个硬编码端口
还请注意,大多数套接字(用于从属)不需要显式绑定到特定的端口号-只有等待传入连接的套接字(如此处的主套接字)才需要成为侦听器并绑定到端口。如果在使用套接字之前未为其指定端口,则操作系统将为该套接字分配一个可用端口。当主机想要响应发送数据的从机时,当侦听器接收数据时,可以访问发送方的地址
我想您将使用UDP进行此操作?不要绑定到特定端口。而是绑定到端口0:
sock.bind(('', 0))
然后,操作系统将为您选择一个可用端口。您可以使用sock.getsockname()[1]
获取选择的端口,并将其传递给从属设备,以便它们可以重新连接
sock
是您创建的套接字,由socket返回。socket
为了让大家了解一下上面的解释:
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]
如果您只需要找到一个空闲端口供以后使用,下面是一个类似于但较短的代码段,使用:
导入socketserver
使用socketserver.TCPServer((“localhost”,0),无)作为s:
空闲端口=服务器地址[1]
请注意,端口不能保证保持空闲状态,因此您可能需要将此代码段和使用它的代码放入一个循环。顺便说一句,如果您只选择一个随机或随机ish端口号(最好大于1024),它可能是可用的。您甚至可以使用端口80或21或其他任何端口,只要没有其他程序在侦听它。在任何给定的时间,在正常系统上,只有一小部分端口在使用。选择一个随机端口不是一个好主意-让操作系统为您选择一个。在POSIX上:请参阅
sock.bind(('',0))
如何将数字传递给从属端口?对我来说,这听起来像是一个鸡和蛋的问题。如果从机是在绑定后创建的,那么在创建它们时,您可以将其作为参数传递。或者,您可以将其写入共享内存或两者都可以访问的文件,或者通过某个已知端口号访问的中央服务器可以跟踪它。什么是sock
?你能用一个导入语句展示一个完整的例子吗?如果在localhost上:也许s.bind(('localhost',0))
更好,所以你可以在返回语句之前快速重用该端口:s.setsockopt(socket.SOL_socket,socket.so_REUSEADDR,1)
@jonEbird有socket。所以在这种情况下,\u REUSEADDR
真的有帮助吗?从我所读到的内容来看,仅与尝试绑定的套接字具有SO\u REUSEADDR
相关,而与是否在延迟套接字上设置该标志无关。