我有一台笔记本电脑,该笔记本电脑的无线适配器的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));
注意:两台计算机都有多个网卡。
答案 0 :(得分:1)
根据您的描述,问题在于发送方正在发送其系统默认多播接口,该接口恰好是不在与192.168.5 / 24网络链接的接口上。如果您将IP_MULTICAST_IF
与发件人的ip或接口索引一起使用(如ipconfig
所示),而不是IP_MULTICAST_TTL
,则TTL为1就可以了,因为您随后将使用共享链接,即:
_udpClient.Client.SetSocketOption(SocketOptionLevel.IP,
SocketOptionName.MulticastInterface, IPAddress.Parse("192.168.5.60").GetAddressBytes());
(您可能需要在地址上做更多工作以使其成为网络顺序的DWORD,并且基于ip options和enums)
答案 1 :(得分:0)
我刚刚解决了。看起来UDP组播数据包的默认TTL值是“ 1”。 ! 我通过使用以下代码将其更改为“ 16”:
_udpClient.Client.SetSocketOption(SocketOptionLevel.IP,SocketOptionName.MuticastTimeToLive,16);