2012-02-03 36 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

相關問題