用boost ASIO找到一个空闲的TCP端口

Find a free TCP port with boost ASIO

本文关键字:一个 端口 TCP ASIO boost      更新时间:2023-10-16

我有一个c++主程序,它调用两个子进程。两个子进程通过主程序指定的TCP端口连接。

我看到寻找空闲端口的用例是,程序将尝试在给定的端口绑定,如果返回"失败",则给出一个端口++并再次尝试。

而对于我的情况,我需要在主程序中决定将哪个端口号传递给这两个子进程。

那么是否有一种简单的方法来检查端口是否可以使用而不尝试绑定它?

port = 1234
while(port < 1299)
  if(port is bindable) 
    call to subprocesses
    break;
  else
    port++

正确的方法是让操作系统为您选择一个可用的端口。创建一个套接字并将其绑定到端口0,然后查询套接字以找出实际绑定的端口。每个主要的操作系统都支持该特性。在Boost ASIO中实现这一功能的具体语法是什么,我不知道。

那么您必须解决每个端口在绑定后实际正在使用的问题,因此您必须:

  1. 使主程序创建并绑定2个套接字,然后将现有的套接字传递给子进程使用。

  2. 使子进程在启用SO_REUSEADDR套接字选项的情况下创建并绑定它们自己的本地套接字,以便它们可以绑定到主程序绑定到的相同端口(即使主程序在启动子进程之前关闭了其绑定的套接字)。

  3. 使子进程获得自己的端口(通过绑定端口0),然后将实际端口号报告给主程序,然后主程序可以根据需要在子进程之间传递它们。

我看到找到一个空闲端口的通常情况是,程序将尝试在给定的端口绑定,如果返回"失败",则给出一个端口++并再次尝试。

不,它不是。我不知道你在哪里看到的,但通常和正确的情况是指定端口0,让操作系统去做,然后使用getsockname()来发现操作系统分配的端口。