1

我有几个 LAN(10.0.0.x)连接到 WAN(192.168.1.x)。每个都通过一个允许网络定向广播的路由器。这是为了让 WAN 上的设备能够发现 LAN 中的设备。

我可以在 LAN(10.0.0.255) 上发送广播并在我的套接字上接收它。但是当我移动到 WAN 时,我可以在 wireshark 中看到它,但不是我的套接字。换句话说,我有一个地址为 10.0.0.1 的设备通过网关向 192.168.1.255 发送相同的消息,但我的套接字没有接收到它。当这种情况发生时,源地址是路由器的地址。这是我的套接字的代码:

                    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 跟踪,但我不确定发布它的最佳方式。谢谢。

4

1 回答 1

0

您是否了解 UDP 不能保证一定会收到数据包?(TCP 使用客户端到服务器的连接)并且数据包被广播到“多播组”(这类似于 IP 地址,但必须在 to 的范围内224.0.0.0239.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

于 2013-07-29T19:51:42.517 回答