找到一个免费的TCP端口与boost ASIO

时间:2014-06-23 13:30:52

标签: c++ sockets boost tcp distributed-computing

我有一个C ++主程序,它调用两个子进程。这两个子进程通过主程序分配的TCP端口连接。

我看到查找自由端口的用例是程序将尝试在给定端口中绑定,如果返回“失败”,则给出一个端口++并重试。

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

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

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

2 个答案:

答案 0 :(得分:3)

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

然后你必须解决每个端口在绑定后实际使用的问题,所以你必须要么:

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

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

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

答案 1 :(得分:1)

  

我看到通常的情况是找到一个自由端口,程序将尝试在给定端口中绑定,如果返回&#34;失败&#34;,给出一个端口++并再试一次。

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