我一直在使用一个组播端口来协调几台机器的本地LAN服务。每台机器在组播端口上侦听指令,当收到某个指令时,将直接发送消息给其他机器。使用组播协调对等消息,如何获得IP?
换句话说,组播端口用于协调对等UDP消息。
实际上,这种方法运行良好,但是存在一个与正确设置这些对等传输有关的问题。基本上,每台机器都需要在多播端口上宣布自己的IP地址,以便其他机器知道,其中当他们希望开始P2P传输时发送消息。
我意识到,在一般标识本地IP的想法是not necessarily sensible,但我没有看到任何其他方式 - 在本地接收IP 必须宣布这种或那种方式。至少我不是在互联网上工作,所以一般来说我不需要担心NAT,只需要识别本地LAN IP。 (允许组播数据包不超过1跳)
我想,如果可能,被动地确定IP,即不发送任何消息。 我一直在使用调用getifaddrs()
的代码,该代码返回机器上的NIC链接列表,并且我扫描此列表中的非零IP地址并选择第一个。
一般来说,这一切都没有问题,但我们遇到了一些问题,例如有线和无线连接的机器都处于活动状态,它会识别出错误的机器,我们发现唯一的解决方法是关闭wifi。
现在,我想一个更可靠的解决方案是向多播发送消息,告诉其他机器使用消息的源地址进行报告;这可能允许识别网络上其他机器实际可见的IP。或者,甚至可能只是在查看多播环回消息。
您认为,有什么被动的解决方案来确定使用哪个地址?如果没有,最好的解决方案是什么?
我使用C语言的POSIX套接字API。必须在Linux,OS X,Windows上工作。 (对于Windows,我一直在使用GetAdapterAddresses()
。)
如果您检查每个值的Ipv4Metric值,是否会给您提供首选接口的指示?如果没有,那么就我所知(至少在Windows中),操作系统会自行决定使用哪一个。你能不能随意绑定其中的一个(并宣布一个)? – Geoff