2013-07-29 77 views
1

我有几个局域网(10.0.0.x)连接到广域网(192.168.1.x)。每个通过允许网络定向广播的路由器。这是为了让局域网中的设备能够被广域网上的设备发现。C#套接字网络定向广播

我可以在局域网(10.0.0.255)上发送广播并在我的套接字上接收它。但是当我移动到广域网时,我可以在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跟踪,但我不知道发布它的最佳方式。谢谢。

回答

0

你明白UDP不能保证会收到一个数据包吗? (TCP使用客户端到服务器的连接),并且数据包被广播到“多播组”(类似于IP地址,但必须在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

+0

我明白UDP的作用,但我确实需要一个广播,而不是多播。这被用来发现局域网后面的控制器和路由器。这就是为什么我需要广播到广域网。我没有发送像这样的数据,只是一条公告消息。 –

+0

这并没有改变你没有连接到多播组这点,这是UDP的必要部分(否则你的数据包会伴随着每个其他UDP数据包通过你的网卡)。 http://en.wikipedia.org/wiki/Multicast – Robadob

+0

我想我很困惑。如果它来自同一个局域网,我创建的套接字将接收到该消息。在这两种情况下,我都将消息发送到广播地址,并且没有设置多播组。我相信端口可以阻止它接收所有的UDP数据包,但我猜测它有可能接收端口上的所有UDP数据。 –