让应用程序通过 UDP 发现彼此
Make Applications discover each other via UDP
我想在 Linux 上用 C 编写一个应用程序,其中一台计算机上有多个进程 运行,它们来自同一个二进制文件。没有确切定义这些过程中会有多少 (2-20)。我希望他们在启动时找到二进制文件的所有其他 运行 个实例。进程应该通过 UDP 与 Linux 套接字进行通信,当一个应用程序发送一个数据包时,每个进程都应该接收它。
目前我已经设置了一些基本的 udp 消息在两个具有固定预定义端口的客户端之间发送。目标是让它们启动并从 os 分配一些端口。然后应用程序应该找到相同二进制文件的其他实例并与它们通信。如何实现这种搜索?起初我试图让它们都通过 SO_REUSEADDR 监听某个固定端口,但是最后启动的进程将接收所有流量。然后我查看了 Multi 和 Broadcasting,但我认为我需要不同的 ips 才能工作。
提前致谢
您的应用程序的每个实例都应创建一个绑定到同一端口的套接字。您需要在绑定之前在套接字上设置 SO_REUSEADDR
以允许发生这种情况。
正如您已经发现的那样,当您将多个 UDP 套接字绑定到同一个端口并且单播数据包到达时,只有这些套接字中的一个会接收该数据包。要解决这个问题,您必须使用多播。如果套接字都在侦听多播地址和它发送的多播数据包,则所有套接字都将接收该数据包。这也有工作的优势,无论进程是否在同一台主机上。
设置 SO_REUSEADDR
并绑定套接字后,您需要通过设置 IP_ADD_MEMBERSHIP
选项加入多播组。您可以为此使用 225.0.0.0 - 239.255.255.255 范围内的任何有效多播地址(避免 232.x.x.x 因为这是针对特定源的多播)并且应用程序的所有实例都应加入同一组。
您还应该设置 IP_MULTICAST_IF
选项来设置传出多播数据包的网络接口,如果您希望应用接收它自己发送的多播消息,您还需要设置 IP_MULTICAST_LOOP
.
我想在 Linux 上用 C 编写一个应用程序,其中一台计算机上有多个进程 运行,它们来自同一个二进制文件。没有确切定义这些过程中会有多少 (2-20)。我希望他们在启动时找到二进制文件的所有其他 运行 个实例。进程应该通过 UDP 与 Linux 套接字进行通信,当一个应用程序发送一个数据包时,每个进程都应该接收它。
目前我已经设置了一些基本的 udp 消息在两个具有固定预定义端口的客户端之间发送。目标是让它们启动并从 os 分配一些端口。然后应用程序应该找到相同二进制文件的其他实例并与它们通信。如何实现这种搜索?起初我试图让它们都通过 SO_REUSEADDR 监听某个固定端口,但是最后启动的进程将接收所有流量。然后我查看了 Multi 和 Broadcasting,但我认为我需要不同的 ips 才能工作。
提前致谢
您的应用程序的每个实例都应创建一个绑定到同一端口的套接字。您需要在绑定之前在套接字上设置 SO_REUSEADDR
以允许发生这种情况。
正如您已经发现的那样,当您将多个 UDP 套接字绑定到同一个端口并且单播数据包到达时,只有这些套接字中的一个会接收该数据包。要解决这个问题,您必须使用多播。如果套接字都在侦听多播地址和它发送的多播数据包,则所有套接字都将接收该数据包。这也有工作的优势,无论进程是否在同一台主机上。
设置 SO_REUSEADDR
并绑定套接字后,您需要通过设置 IP_ADD_MEMBERSHIP
选项加入多播组。您可以为此使用 225.0.0.0 - 239.255.255.255 范围内的任何有效多播地址(避免 232.x.x.x 因为这是针对特定源的多播)并且应用程序的所有实例都应加入同一组。
您还应该设置 IP_MULTICAST_IF
选项来设置传出多播数据包的网络接口,如果您希望应用接收它自己发送的多播消息,您还需要设置 IP_MULTICAST_LOOP
.