簡體   English   中英

在不同接口上接收具有相同源地址的不同組播

[英]Receiving different multicast with same source address on different interfaces

在具有多個網絡接口的系統上,我可以在不同的網絡上使用相同的多播地址和端口組合,並且它們上的數據也不同。 我希望能夠使用多個網卡連接到它們,並在每個接口上接收不同的數據。

為此,我使用IP_MULTICAST_IF選項綁定到要接收的接口:

ip_mreqn mreqn;
memset(&mreqn, 0, sizeof (ip_mreqn));
mreqn.imr_multiaddr.s_addr = inet_addr(mc);
mreqn.imr_address.s_addr = INADDR_ANY;
mreqn.imr_ifindex = if_nametoindex(device);
if (setsockopt(mct->fd, IPPROTO_IP, IP_MULTICAST_IF, &mreqn, sizeof(mreqn)) < 0) {
  perror("setsockopt multicast if");
  return 1;
}

並通過將IP_ADD_MEMBERSHIP設置為相同的結構來確保僅在該接口上發送加入請求:

if (setsockopt(mct->fd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreqn, sizeof(mreqn)) < 0) {
  perror("setsockopt add membership");
  return 1;
}

盡管IP_ADD_MEMBERSHIP代碼有效(加入請求僅在指定的接口上發送),但IP_MULTICAST_IF無效。 相反,一旦它能夠在任何接口上加入多播,即使它們設置了不同的imr_ifindex集,我也將通過所有套接字接收相同的數據。

IP_MULTICAST_IF ioctl不控制傳入選擇,它正在為套接字的傳出多播數據包設置套接字的默認接口。

IP_ADD_MEMBERSHIP是配置傳入多播的唯一機制,它創建的成員資格是針對整個主機的,主機不會根據其請求的成員資格來調整向各個套接字的傳遞。 (您可以使用netstat -gn觀察主機成員身份,並且使用引用計數來確定主機何時可以停止觀察,但不能確定哪個套接字正在接受扇出。如果您從任何套接字獲得匹配的成員資格,則所有IP_ADD_MEMBERSHIP適用的bind(2)將開始接收該多播,即使他們從未使用過IP_ADD_MEMBERSHIP 。)

在不更改系統設置的情況下區分這些數據包的通常方法是,使用輔助數據識別它們的接口,將它們全部接收到套接字上。 在Linux上,此輔助數據設置使用ip(7)所述的IP_PKTINFO完成。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM