[英]Sending and receiving multicast on the same Linux machine from different interfaces
[英]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.