2014-06-18 163 views
1

我目前正在C#/ Android客戶端/服務器項目上工作。發送廣播包問題

我有一個服務器應用程序,運行在Windows C#,它發送在端口的廣播消息8000。

的想法是客戶端應用程序(機器人)接收廣播,然後顯示該服務器的主機名和IP,從該消息通過廣播發送,在Android設備上供用戶選擇。

下面是我如何嘗試做廣播。

int availableTCPSocket = 0; 
      try 
      { 
       //UdpClient udp = new UdpClient(); 
       Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); 
       socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, 1); 
       availableTCPSocket = getAvailableTCPSocket(); 

       //IPEndPoint endpoint = new IPEndPoint(IPAddress.Broadcast, BROADCAST_PORT); 
       IPEndPoint endpoint = new IPEndPoint(IPAddress.Parse("192.168.1.255"), BROADCAST_PORT); 

       XmlGenerator xmlGenerator = new XmlGenerator(); 
       xmlGenerator.addStartElement("ServerInformation"); 
       xmlGenerator.addElementString("Hostname", Dns.GetHostName()); 
       NetworkAdapterDetails networkAdapterDetails = getNetworkAdapterDetails(); 
       xmlGenerator.addElementString("IP_Address", networkAdapterDetails.ipAddress); 
       xmlGenerator.addElementString("MAC_Address", networkAdapterDetails.macAddress); 
       xmlGenerator.addElementString("AvailableTCPSocket", availableTCPSocket.ToString()); 
       xmlGenerator.addEndElement(); 
       xmlGenerator.flushAndCloseXmlWriter(); 

       string udpData = xmlGenerator.returnXml(); 
       byte[] sendBytes = Encoding.ASCII.GetBytes(udpData); 

       while (true) 
       { 
        //udp.Send(sendBytes, sendBytes.Length, endpoint); 
        socket.SendTo(sendBytes, endpoint); 
        Console.WriteLine("Broadcast Sent"); 
        System.Threading.Thread.Sleep(5000); 
       } 
      } 
      catch (Exception ex) 
      { 
       Console.WriteLine("Broadcast Sender Exception: {0}", ex.Message); 
      } 

如果我設置的端點被IPAddress.Broadcast它說,這是255.255.255.255但我的設備從不接收廣播。

如果我將端點硬編碼爲192.168.1.255,那麼我的設備會接收廣播。

因此,我有兩個問題。

  1. 如果我使用IPAddress.Broadcast爲什麼我的設備沒有收到任何東西,如果這應該是廣播。

  2. 如果192.168.1.255是正確的廣播地址,我怎樣才能找出什麼地址應該是動態的,這個想法是服務器將提供下載,所以必須工作在不同的網絡配置192.168.1.255可能不是正確的地址。

它也需要很長的時間的設備接收該數據包,服務器寫入每次向控制檯其環形輪和發送廣播,但它需要約4或5廣播來的設備之前被髮送收到它。它在WIFI網絡上,但在所有設備上都有強大的信號,在互聯網上下載60mb,在路由器和設備之間ping 2ms。

感謝您提供的任何幫助。

回答

3

Windows 7以不同的方式處理255.255.255.255廣播。更多信息here: Send UDP broadcast on Windows 7

使用子網廣播,而不是255.255.255.255

代碼來獲取子網廣播地址

public static IPAddress GetBroadcastAddress(this IPAddress address, IPAddress subnetMask) 
{ 
    byte[] ipAdressBytes = address.GetAddressBytes(); 
    byte[] subnetMaskBytes = subnetMask.GetAddressBytes(); 

    if (ipAdressBytes.Length != subnetMaskBytes.Length) 
     throw new ArgumentException("Lengths of IP address and subnet mask do not match."); 

    byte[] broadcastAddress = new byte[ipAdressBytes.Length]; 
    for (int i = 0; i < broadcastAddress.Length; i++) 
    { 
     broadcastAddress[i] = (byte)(ipAdressBytes[i] | (subnetMaskBytes[i]^255)); 
    } 
    return new IPAddress(broadcastAddress); 
} 
1

通過Wi-Fi有時不允許發送數據包過255.255.255.255取決於它的安全設置。在運行時找到網絡的廣播地址&使用它。您可以通過執行以下操作來獲取任何網絡的廣播網絡地址。 broadcastaddress =(ipaddressofthesystem & netmask)&〜netmask; 也作爲替代方案,您應該考慮使用多播地址。