我有几个LAN(10.0.0.x)连接到WAN(192.168.1.x)。每个通过一个允许网络定向广播的路由器。这是为了允许WAN中的设备发现LAN中的设备。
我可以在局域网(10.0.0.255)上发送广播并在我的套接字上接收它。但是当我移动到WAN时,我可以在wireshark中看到它,但不是我的插座。换句话说,我有一个地址10.0.0.1的设备通过网关向192.168.1.255发送相同的消息,但我的套接字没有收到它。发生这种情况时,源地址是路由器的地址。这是我的socket的代码:
udpSocket = new Socket(AddressFamily.InterNetwork,
SocketType.Dgram, ProtocolType.Udp);
//Assign the any IP of the machine and listen on port number 5000
IPEndPoint ipEndPoint = new IPEndPoint(IPAddress.Any, 5000);
//Bind this address to the server
udpSocket.Bind(ipEndPoint);
IPEndPoint ipeSender = new IPEndPoint(IPAddress.Any, 5000);
//The epSender identifies the incoming clients
EndPoint epSender = (EndPoint)ipeSender;
//Start receiving data
udpSocket.BeginReceiveFrom(byteData, 0, byteData.Length,
SocketFlags.None, ref epSender, new AsyncCallback(ReceiveAnnounce), epSender);
我为每条消息都有一个wireshark跟踪,但我不确定发布它的最佳方式。感谢。
答案 0 :(得分:0)
您是否了解UDP无法保证会收到数据包? (TCP使用客户端到服务器连接)并且数据包被广播到“多播组”(这类似于IP地址但必须在224.0.0.0
到239.255.255.255
范围内)而不是IP 。
你使用IPAddress.Any
告诉它使用所有的网络接口,但是你永远不会告诉它使用哪个组播组,我从来没有在C#中做过这个,但是看起来你想添加这一行BeginReceiveFrom之前的代码;
udpSocket.SetSocketOption(SocketOptionLevel.IP,SocketOptionName.AddMembership,new MulticastOption(TARGET_IP));
您应该将TARGET_IP
替换为您希望收听的多播群组的地址。
我从这个网站上获取了这行代码; http://osix.net/modules/article/?id=409