[英]how to join a multicast group using igmp v3 in C
為了加入多播組,我習慣於看到如下代碼:
struct ip_mreqn mreq;
mreq.im_address.s_addr = INADDR_ANY
mreq.imr_ifindex = 0;
inet_aton("232.etc..", $mreq.imr_multiaddr);
setsockopt(descriptor, SOL_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq));
現在,我遇到一個問題,有人告訴我這是v2 igmp加入請求,並且他們要求v3。 這是上面代碼中需要解決的問題,還是運行上述代碼的主機上的硬件/網絡/操作系統問題? 如果上述代碼有誤,我可以采取什么措施來糾正它?
現在,我遇到一個問題,有人告訴我這是v2 igmp加入請求,並且他們要求v3。
目前,這不是有效的加入請求,因為它沒有指定有效的多播組。 INADDR_ANY不是多播組,嚴格來說是綁定地址。 組播組始於224.0.0.0,但是請確保選擇一個合法且可使用的組播組。
獲得此權限時所使用的協議是V2還是V3不受此代碼的影響:這取決於UDP協議棧調用時的功能。 您對此沒有任何控制權。 我也看不出為什么“某人”也需要 IGMP V3。
即使已經有一個可以接受的答案,我仍然覺得它無法回答原始問題。
如果您使用的是Linux,則可以通過更改此文件中的值來強制IGMP版本:
/proc/sys/net/ipv4/conf/eth1/force_igmp_version
請注意,如果我有“ eth1”,則必須使用您感興趣的接口。值0表示自動,而1、2或3強制使用此特定版本的IGMP。
因此,例如,如果要在eth0上使用IGMPv3,則可以執行以下操作:
echo 3 > /proc/sys/net/ipv4/conf/eth1/force_igmp_version
在Windows上,您可以運行regedit
並在HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters
創建一個名為IGMPVersion
的新DWORD。 設置為2
表示IGMPv1,設置為3
表示IGMPv2,設置為4
表示IGMPv3。
附帶說明,兩個系統在自動運行時,應始終使用可用的最高版本。 這意味着通常沒有理由強制使用IGMPv3。 如果您碰巧與某些不支持v3的舊設備進行交互,則可能需要強制使用v2。
最后,可以在您的c代碼上強制加入要發送的IGMP版本的唯一方法(我的意思是之前沒有調整系統配置),是如果您使用原始套接字並自行裝入整個數據包。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.