gpt4 book ai didi

c - 使应用程序通过 UDP 相互发现

转载 作者:行者123 更新时间:2023-11-30 19:01:38 25 4
gpt4 key购买 nike

我想在 Linux 上用 C 语言制作一个应用程序,其中一台计算机上运行多个进程,这些进程来自同一个二进制文件。没有确切定义有多少个这样的进程 (2-20)。我希望他们在启动时找到二进制文件的所有其他正在运行的实例。这些进程应该通过 UDP 与 Linux 套接字进行通信,并且当一个应用程序发送数据包时,每个进程都应该接收它。

目前,我已经在具有固定预定义端口的两个客户端之间设置了一些基本的 udp 消息发送。目标是让它们启动并从操作系统分配一些端口。然后,应用程序应该找到同一二进制文件的其他实例并与它们通信。如何实现这种搜索呢?起初我试图让它们都通过 SO_REUSEADDR 监听某个固定端口,但只有最后一个启动的进程才会收到所有流量。然后我研究了多重和广播,但我认为我需要不同的 ip 才能工作。

提前致谢

最佳答案

应用程序的每个实例都应创建一个绑定(bind)到同一端口的套接字。您需要在绑定(bind)之前在套接字上设置 SO_REUSEADDR 以允许这种情况发生。

正如您已经发现的,当您有多个 UDP 套接字绑定(bind)到同一端口并且单播数据包到达时,只有其中一个套接字会收到该数据包。为了解决这个问题,您必须使用多播。如果套接字都在监听多播地址及其发送的多播数据包,则所有套接字都将收到该数据包。这还有一个优点,无论进程是否位于同一主机上,都可以工作。

设置SO_REUSEADDR并绑定(bind)套接字后,您需要通过设置IP_ADD_MEMBERSHIP选项来加入多播组。您可以为此使用 225.0.0.0 - 239.255.255.255 范围内的任何有效多播地址(避免使用 232.x.x.x,因为它用于特定于源的多播),并且应用程序的所有实例都应加入同一组。

您还应该设置IP_MULTICAST_IF选项来设置传出多播数据包的网络接口(interface),如果您希望应用程序接收它自己发送的多播消息,您还需要设置IP_MULTICAST_LOOP

关于c - 使应用程序通过 UDP 相互发现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57477537/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com