2011-10-14 49 views
1

我一直在使用一个组播端口来协调几台机器的本地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()。)

+0

如果您检查每个值的Ipv4Metric值,是否会给您提供首选接口的指示?如果没有,那么就我所知(至少在Windows中),操作系统会自行决定使用哪一个。你能不能随意绑定其中的一个(并宣布一个)? – Geoff

回答

0

您的问题关于如何获取地址,以便您可以正确地做广告是从错误的一面来看它。试图猜测你的地址是什么是一个失败的主张。更适合对方自己检测它。

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

0

我使用我用来发送通知多播消息的接口上的地址 - 有线接口上通告有线地址并在无线接口上宣告无线地址。

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

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

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