Gic*_*ico 2 windows ip networking network-programming multicast
这些天我在玩多播,遇到了一些我不明白的奇怪事情。
我创建了一个聊天多播客户端,一切似乎都正常。之后,我阅读了一些 linux 文档并发现通过 ping 224.0.0.1 应该从加入某个多播组的所有节点返回我的回复。我在 xp 和 win7 机器上试过。两者的行为是相同的。我的客户似乎只加入我定义的组 (224.0.19.1)。它不加入 224.0.0.1 组。
来自wireshark:[source ip] 224.0.0.22 IGMPv3 54 Membership Report / Join group 224.0.19.1 for any source
这是我设置套接字的方式:
IPEndPoint ipep = new IPEndPoint(IPAddress.Any, int.Parse(port));
m_socket.Bind(ipep);
IPAddress ip = IPAddress.Parse(mcastGroup);
m_socket.SetSocketOption(
SocketOptionLevel.IP, SocketOptionName.AddMembership,
new MulticastOption(ip, IPAddress.Any));
Run Code Online (Sandbox Code Playgroud)
然后我检查了netsh:
C:\Users\user1>netsh interface ip show joins
Interface 1: Loopback Pseudo-Interface 1
Scope References Last Address
---------- ---------- ---- ---------------------------------
0 2 Yes 239.255.255.250
Interface 11: LAN
Scope References Last Address
---------- ---------- ---- ---------------------------------
0 0 Yes 224.0.0.1
0 1 Yes 224.0.0.252
0 1 Yes 224.0.19.1
0 1 Yes 230.230.230.230
0 2 Yes 239.255.255.250
Interface 15: Local Area Connection* 9
Scope References Last Address
---------- ---------- ---- ---------------------------------
0 0 Yes 224.0.0.1
Run Code Online (Sandbox Code Playgroud)
正如您所注意到的,没有引用 224.0.0.1 地址。当然,我确实关闭了两台机器上的防火墙。
现在的问题是:Windows 不支持此功能吗?.NET 不支持?我是不是忘记实施一些东西了?我将不胜感激任何帮助。谢谢。
我现在花了一些时间调查这个问题,我决定分享我学到的东西。
一旦您绑定到某个多播组,您的引用计数就会增加。对 224.0.0.1 的引用始终为 0,因为无法绑定到该组中(至少在 win7 上不能)。
似乎在 Windows 上禁用了多播 ping。我没有找到答案,但我发现我的 HP 打印机正在回复 ping 224.0.0.1。
D:\tools>ping 224.0.0.1
Pinging 224.0.0.1 with 32 bytes of data:
Reply from 10.13.72.103: bytes=32 time<1ms TTL=64
Reply from 10.13.72.103: bytes=32 time<1ms TTL=64
Reply from 10.13.72.103: bytes=32 time<1ms TTL=64
Reply from 10.13.72.103: bytes=32 time<1ms TTL=64
Run Code Online (Sandbox Code Playgroud)
还有另一个选项可以检查是否有人正在使用多播地址以及他们在哪个组中。通过运行igmpquery tool,您可以获得所有节点的成员资格报告。该工具实际上在 224.0.0.1 地址上发送 IGMP 一般查询,然后从所有节点获得响应:
Source Destination Protocol Length Info
10.11.72.28 224.0.0.1 IGMPv2 60 Membership Query, general
10.11.72.12 224.0.0.252 IGMPv2 60 Membership Report group 224.0.0.252
10.11.72.12 239.255.255.250 IGMPv2 60 Membership Report group 239.255.255.250
10.11.72.28 224.0.19.1 IGMPv2 46 Membership Report group 224.0.19.1
10.11.72.254 224.0.0.2 IGMPv2 60 Membership Report group 224.0.0.2
10.11.72.103 224.0.0.251 IGMPv1 60 Membership Report
Run Code Online (Sandbox Code Playgroud)
节点只有在侦听某个多播地址时才会响应。win节点可以加入224.0.0.1组,只要能接收IGMP请求即可。这可以通过将注册表值 IGMPLevel 设置为 0 来禁用。
通过这个,我解释了自己所有的问题。唯一仍然困扰我的是,我没有找到任何官方文档表明 Windows 不支持多播 ping。好吧,列表不完整,因为它可以发送 ping 请求,但不能发送回声。
| 归档时间: |
|
| 查看次数: |
9912 次 |
| 最近记录: |