簡體   English   中英

如何在C中使用igmp v3加入多播組

[英]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.

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