使用多播协调点对点消息,如何获得接收IP



我一直在研究一个本地局域网服务,它使用多播端口来协调几台机器。每台机器在多播端口上监听指令,当接收到某个指令时,将消息直接发送给其他机器。

换句话说,多播端口用于协调点对点UDP消息传递。

在实践中,这工作得很好,但有一个挥之不去的问题与正确设置这些点对点传输有关。基本上,每台机器都需要在多播端口上宣布自己的IP地址,以便其他机器知道当他们希望开始P2P传输时,将消息发送到

我意识到一般来说,识别本地IP的想法不一定是明智的,但我没有看到任何其他方法-本地接收IP 必须以某种方式宣布。至少我不是在互联网上工作,所以一般来说我不需要担心nat,只需要识别本地LAN IP。(组播报文不能超过1跳)

如果可能的话,我想被动地确定IP,即不发送任何消息。我一直在使用调用getifaddrs()的代码,它返回机器上的网卡链表,并且我扫描此列表中的非零IP地址并选择第一个。

一般来说,这工作得很好,但是我们遇到了一些问题,例如一台同时具有有线和wifi连接的机器是活动的,它会识别出错误的机器,我们发现的唯一的解决办法是关闭wifi。

现在,我想象一个更可靠的解决方案是向多播发送一个消息,告诉其他机器报告消息的源地址;这样可以识别哪些IP对网络上的其他机器是可见的。或者,甚至只是查看多播环回消息也可以工作。

你怎么看,有没有什么被动的解决方案来确定使用哪个地址?如果没有,最好的主动解决方案是什么?

我使用POSIX套接字API从C.必须工作在Linux, OS X, Windows。(对于Windows,我一直使用GetAdapterAddresses())

你关于如何获得地址以便你可以正确地宣传它的问题是从错误的角度看它。试图猜测你的地址是徒劳无益的。最好让对方自己检测。

当一台监听机器接收到一条消息时,它可能正在使用recvfrom(2)执行操作。第五个参数是一个缓冲区,如果底层协议提供的话,内核将在其中存储对等体的地址。由于您使用的是IP/UDP,缓冲区应该用sockaddr_in填充,显示发送方的IP地址。

我将使用我用来发送通告多播消息的接口上的地址——在有线接口上宣布有线地址,在无线接口上宣布无线地址。

当所有的接收者都生活在有线一侧时,他们将永远不会看到无线网络上的消息。

当有线和无线网络之间有桥接时,在发现中增加第二步用于往返时间估计,并在公告包中包含唯一的主机ID,以便可以检测到到同一主机的多条路由并选择最佳路由。

另外,添加一个配置选项来限制服务只使用某些接口可能是个好主意。

最新更新