使用组播协调点对点消息,如何获取IP?

时间:2011-10-14 18:10:22

标签: sockets networking posix

我一直致力于使用多播端口协调多台计算机的本地局域网服务。每台机器都在组播端口上监听指令,当收到某条指令时,会直接向其他机器发送消息。

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

在实践中,这非常有效,但是存在与正确设置这些对等传输相关的挥之不去的问题。基本上,每台机器都需要在组播端口上发布自己的IP地址,以便其他机器知道何处在希望启动P2P传输时发送消息。

我意识到一般来说识别本地IP的想法是not necessarily sensible,但我没有看到任何其他方式 - 本地接收IP 必须单向宣布或另一个。至少我不是在网上工作,所以一般我不需要担心NAT,只需要识别本地局域网IP。 (允许多播数据包不超过1跳。)

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

一般情况下,这样做没问题,但我们遇到了一些问题,例如有线和无线连接的机器都处于活动状态,它会找出错误的机器,我们发现的唯一解决办法是关闭的WiFi。

现在,我认为更可靠的解决方案是向多播发送消息,告知其他机器使用消息的源地址向其报告;这可能允许识别网络上其他机器实际可见的IP。或者,即使只是查看多播环回消息也可以。

您如何看待,是否有任何被动解决方案来确定使用哪个地址?如果没有,什么是最好的有效解决方案?

我正在使用来自C的POSIX套接字API。必须适用于Linux,OS X,Windows。 (对于Windows,我一直在使用GetAdapterAddresses()。)

2 个答案:

答案 0 :(得分:0)

关于如何获取地址以便正确宣传的问题是从错误的一面看。尝试猜测你的地址是一个失败的主张。最好让对方自己检测它。

当监听机器收到消息时,它可能正在使用recvfrom(2)。第五个参数是一个缓冲区,如果底层协议提供了内核,内核将存储该缓冲区的地址。由于您使用的是IP / UDP,因此应使用显示发件人IP地址的sockaddr_in填充缓冲区。

答案 1 :(得分:0)

我使用我用来发送公告组播消息的接口上的地址 - 在有线接口上宣布有线地址,并在无线接口上公布无线地址。

当所有接收器都在有线端时,他们将永远不会在无线网络上看到该消息。

当有线和无线网络之间存在桥接时,在发现中添加第二步以进行往返时间估计,并在通告数据包中包含唯一的主机ID,因此可以检测到到同一主机的多条路由并且选择了最好的一个。

此外,添加配置选项以限制某些接口的服务可能是个好主意。