C# UdpClient 无法发送多播 UDP 数据包
C# UdpClient Can't Send Multicast UDP Packet
我有一台笔记本电脑,它有一个 IP 地址为“192.168.5.60”的无线适配器。这台笔记本电脑将发送 UDP 多播数据包。
我有一台台式电脑,其网络适配器 IP 为“192.168.5.90”。我在这台台式电脑上安装了一个名为 "Multicast Tester" 的软件,它加入了多播组(“239.194.190.22:4000”) .
问题是,如果我使用从互联网安装在笔记本电脑上的另一个软件并将多播 udp 数据包发送到“239.194.190.22:4000”,我可以在台式电脑上接收这些数据包。
如果我使用我的程序发送这些数据包,我无法接收多播数据包。
我的代码:
UdpClient udpClient = new UdpClient();
udpClient.client.bind(new IPEndPoint(IPAddress.Parse("192.168.5.60"), 0));
udpClient.JoinMulticastGroup(IPAddress.Parse("239.194.190.22"));
udpClient.send(myData, myData.length, new IPEndPoint(IPAddress.Parse("239.194.190.22"), 4000));
注意:两台电脑都有多个网卡。
我刚刚解决了。看起来 UDP 多播数据包的默认 TTL 值为“1”。 !
我使用以下代码将其更改为“16”:
_udpClient.Client.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.MuticastTimeToLive, 16);
根据您的描述,问题是您的发件人正在发送其系统默认多播接口,该接口恰好不在 link 与 192.168.5/24 网络上。如果您将 IP_MULTICAST_IF
与发件人的 ip 或接口索引(如 ipconfig
所示)而不是 IP_MULTICAST_TTL
一起使用,那么 TTL 1 就可以了,因为您随后使用的是共享link,即:
_udpClient.Client.SetSocketOption(SocketOptionLevel.IP,
SocketOptionName.MulticastInterface, IPAddress.Parse("192.168.5.60").GetAddressBytes());
(您可能需要对地址做一些更多的工作,使其成为网络顺序中的 DWORD,并基于 ip options and enums)
我有一台笔记本电脑,它有一个 IP 地址为“192.168.5.60”的无线适配器。这台笔记本电脑将发送 UDP 多播数据包。
我有一台台式电脑,其网络适配器 IP 为“192.168.5.90”。我在这台台式电脑上安装了一个名为 "Multicast Tester" 的软件,它加入了多播组(“239.194.190.22:4000”) .
问题是,如果我使用从互联网安装在笔记本电脑上的另一个软件并将多播 udp 数据包发送到“239.194.190.22:4000”,我可以在台式电脑上接收这些数据包。
如果我使用我的程序发送这些数据包,我无法接收多播数据包。
我的代码:
UdpClient udpClient = new UdpClient();
udpClient.client.bind(new IPEndPoint(IPAddress.Parse("192.168.5.60"), 0));
udpClient.JoinMulticastGroup(IPAddress.Parse("239.194.190.22"));
udpClient.send(myData, myData.length, new IPEndPoint(IPAddress.Parse("239.194.190.22"), 4000));
注意:两台电脑都有多个网卡。
我刚刚解决了。看起来 UDP 多播数据包的默认 TTL 值为“1”。 ! 我使用以下代码将其更改为“16”:
_udpClient.Client.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.MuticastTimeToLive, 16);
根据您的描述,问题是您的发件人正在发送其系统默认多播接口,该接口恰好不在 link 与 192.168.5/24 网络上。如果您将 IP_MULTICAST_IF
与发件人的 ip 或接口索引(如 ipconfig
所示)而不是 IP_MULTICAST_TTL
一起使用,那么 TTL 1 就可以了,因为您随后使用的是共享link,即:
_udpClient.Client.SetSocketOption(SocketOptionLevel.IP,
SocketOptionName.MulticastInterface, IPAddress.Parse("192.168.5.60").GetAddressBytes());
(您可能需要对地址做一些更多的工作,使其成为网络顺序中的 DWORD,并基于 ip options and enums)