我有一个C ++主程序,它调用两个子进程。这两个子进程通过主程序分配的TCP端口连接。
我看到查找自由端口的用例是程序将尝试在给定端口中绑定,如果返回“失败”,则给出一个端口++并重试。
虽然对于我的情况,我需要在我的主程序中决定将哪个端口号传递给这两个子进程。
有没有一种简单的方法来检查是否可以使用端口而不尝试绑定它?
像
port = 1234
while(port < 1299)
if(port is bindable)
call to subprocesses
break;
else
port++
答案 0 :(得分:3)
找到空闲端口的正确方法是让操作系统为您选择一个可用端口。创建一个套接字并将其绑定到端口0,然后查询套接字以找出实际绑定的端口。每个主要OS都支持该功能。在Boost ASIO中实现它的具体语法是什么,我不知道。
然后你必须解决每个端口在绑定后实际使用的问题,所以你必须要么:
使主程序创建并绑定2个套接字,然后将现有套接字传递给子进程以供使用。
使子进程创建并绑定自己的本地套接字并启用SO_REUSEADDR
套接字选项,以便它们可以绑定到主程序绑定的相同端口(即使主程序关闭了它在启动子进程之前绑定套接字。)
使子进程获得自己的端口(通过绑定到端口0),然后将实际端口号报告回主程序,然后主程序可以根据需要在子进程之间传递它们。 / p>
答案 1 :(得分:1)
我看到通常的情况是找到一个自由端口,程序将尝试在给定端口中绑定,如果返回&#34;失败&#34;,给出一个端口++并再试一次。
不,不是。我不知道你在哪里看到它,但通常和正确的情况是指定端口零并让操作系统执行它,然后使用getsockname()
来发现操作系统分配的端口。