2013-07-29 76 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數據。 –