2

我需要在一台机器上让多个进程相互协调,以便每个进程选择不同的端口来创建套接字以与不同的机器通信。每个进程必须从一系列可用端口中选择一个端口号,以便在任何时间点只有一个进程使用给定的端口号。

是否有现有的机制来进行这种协调,还是我需要建立自己的机制?

目前,我正在使用磁盘上的文件来注册端口号和使用该端口的 PID。如果找到一个不再运行 PID 的条目,则删除该条目,因为假定进程已非正常退出,因此需要获取该条目。

但是,我似乎有某种竞争条件,因为在极少数情况下,我最终有两个进程使用相同的端口,而第二个进程看不到显示保留端口的文件内容并最终再次使用它。

与其解决这个问题,我宁愿采用现有的机制来避免端口冲突,所以我想问这样的实用程序是否已经存在。

4

1 回答 1

1

与 TCP 或 UDP 通信时,套接字由 4 元组区分:

  • 本地地址
  • 本地端口
  • 远程地址
  • 远程端口

如果您不理会本地分配,并且正在使用连接的协议进行通信,则该connect调用将为您找到可用的本地端口。如果您仅限于特定范围的端口,则需要进行本地地址和端口绑定。但是,在这种情况下,由于每个进程只处理一个连接,我只会在每个进程启动时为其分配一个唯一的端口,而不是让它尝试找到一个可用的端口。

也就是说,假设有一个进程负责启动所有其他进程,那么该进程将决定启动时的进程应该使用哪个端口。这更简单,因为决策是由单个实体做出的,因此它可以使用简单的算法,例如:

for (unsigned short p = minPort; p < maxPort; ++p) {
    child_pid = startWorker(p);
    child_pid_map[child_pid] = p;
}

如果孩子死了,启动进程可以child_pid_map立即咨询重用该端口。

如果无法使用外部代理来分配端口,最简单的技术就是尝试bind调用范围内的随机端口。如果失败并显示EADDRINUSE,则逐步尝试序列中的下一个端口号(必要时包装),直到成功,或者您已尝试所有端口。

于 2012-06-10T10:15:02.790 回答