2012-02-03 66 views
1

我实现了一个利用多播消息的网络发现过程。它允许发现连接到同一网段的任何IP地址的特定设备。为什么具有相同源IP地址的多播消息被忽略

客户端A发送多播消息,请求其他客户端。其他客户端回复多播消息“我在这里......”。基本上这工作正常。

但有一种情况会导致我的麻烦。

Client A  Client B 
192.168.2.5 192.168.2.5 
    |    | 
    \__________/
     >>> 
    UDP Multicast Message: 
    Source: 192.168.2.5 | Destination: 224.0.0.150 

重合可能出现,发送多播消息的客户端A和客户端B都听同一个ip地址。在这种情况下,UDP数据包的源地址与目标客户端的IP地址相同。因此,客户端B上的应用程序不会收到任何多播消息。

我猜测具有相同消息的组播消息被阻塞并丢弃在ip-stack中。无论如何,有没有办法(套接字设置)来接收它。

+1

通常情况下,两台电脑不可能有相同的ip。我认为交换机不允许将包发送到两个不同的端口。 – rekire 2012-02-03 11:57:24

+0

当然两次同样的IP是不允许的。但可能会发生。无论如何,因为我知道交换机不关心IP地址(> Layer 3)。 – Maus 2012-02-03 12:06:45

+0

@Maus交换机不会连接到它们的东西,如果他们发现2台具有相同IP的机器,它们的ARP缓存将会感到困惑,并且不知道将数据包发送到哪里,或者只发送到其中的一个,或者拒绝向他们中的任何人发送几乎任何东西。 – nos 2012-02-03 12:10:23

回答

4

是的,您可以让主机读取自己的多播数据包(通常只是源IP地址上的过滤器),这由IP_MULTICAST_LOOP套接字选项控制。

int loop = 1; 
setsockopt(socket, IPPROTO_IP, IP_MULTICAST_LOOP, &loop, sizeof(loop)); 
+0

[IP_MULTICAST_LOOP已启用](http://www.tldp.org/HOWTO/Multicast-HOWTO-6.html),因此通常不需要使用此setsockopt,除非您在程序的一部分中禁用循环然后想要重新启用它。 – 2015-03-13 20:50:53

相关问题