【发布时间】:2021-03-22 22:33:11
【问题描述】:
我正在使用 C# .net 框架 4.7。我的应用程序正在尝试加入距离几台路由器(跳数)远的多播组。结果,我尝试发送 TTL > 1 的 IGMP 数据包。目前,我使用 UdpClient.JoinMulticastGroup() 并将 TTL 参数设置为 3,但是当我使用 Wireshark 检查 IGMP 数据包时,TTL 保持在 1 .
这是我的代码
UdpClient udpClient = new UdpClient();
// Creates an IPAddress to use to join and drop the multicast group.
IPAddress multicastIpAddress = IPAddress.Parse("239.192.16.107");
udpClient.Client.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.IpTimeToLive, 10);
udpClient.Client.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.MulticastTimeToLive, 10);
udpClient.Ttl = 10;
// The packet dies after 10 router hops.
udpClient.JoinMulticastGroup(multicastIpAddress, 10);
网上的几篇帖子似乎暗示IGMP是针对本地网络的,所以TTL总是1;但是,如果这是真的,为什么 JoinMulticastGroup 允许我们设置 TTL?但是另一方面,为什么我将 TTL 设置为 3 时 TTL 不会改变?
有人可以确认多播加入数据包 (IGMP) 是否可以具有 1 以外的 TTL 值吗?如果可以,那么我的代码中是否缺少某些内容?
更新: 我把 TTL 设置为 10,Wireshark 还是显示 TTL=1
【问题讨论】:
-
我不确定您在加入多播组后是否调用 connect。做“加入”后,你是否直接进入“接收”模式。对于 TTL,我会从 10 或 20 开始。
-
如果您将 TTL 设置为 10,然后在 wireshark 中看到 8 - 您的“pc”在到达 wireshark 之前将其递减 2。
-
是的,加入后我有权接收模式。我不打算发送任何东西。
-
我尝试了 TTL=10 和 20,但在 Wireshark 中都显示 TTL=1。我只是把它的截图放在原帖中
-
只是我的直觉,在你的代码中有这一行 client.Connect(destEP); “禁用”连接上的多播。如果您可以设置一个更受控制的测试,这将有助于消除特定于环境的设置,那么您就可以信任您的代码并解决真正的问题。
标签: c# multicast multicastsocket igmp