Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在本地主机上,如何选择空闲端口号?_Python_Sockets_Ipc_Port - Fatal编程技术网

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

Python 在本地主机上,如何选择空闲端口号?,python,sockets,ipc,port,Python,Sockets,Ipc,Port,我正在尝试处理进程间通信,因为我不知道如何在Windows下使用命名管道,所以我想我将使用网络套接字。一切都发生在当地。服务器能够在单独的进程中启动从属服务器,并侦听某些端口。奴隶们做他们的工作并将结果提交给主人。如何确定哪个端口可用?我想我不能监听端口80或21 我正在使用Python,如果这样可以减少选择的话。将套接字绑定到端口0。将选择1024到65535之间的随机空闲端口。您可以在bind()之后立即使用getsockname()检索所选端口,您可以在任何需要的端口上侦听;通常,用户应用

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


我正在使用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
相关,而与是否在延迟套接字上设置该标志无关。