【问题标题】:Sending broadcast packet issue发送广播包问题
【发布时间】:2014-08-09 08:17:03
【问题描述】:

我目前正在开发一个 C#/Android 客户端/服务器项目。

我有一个服务器应用程序,在 Windows 上运行 C#,它在端口 8000 上发送广播消息。

这个想法是客户端应用程序(Android)接收广播,然后从通过广播发送的消息中显示服务器主机名和IP,供用户选择。

以下是我尝试进行广播的方式。

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. 1234563可能不是正确的地址。

设备接收数据包也需要很长时间,服务器每次循环都会写入控制台并发送广播,但在设备接收之前大约需要发送 4 或 5 个广播。它在 WIFI 网络上,但所有设备上的信号都很强,互联网上下载 60mb,路由器和设备之间 2 毫秒 ping。

感谢您提供的任何帮助。

【问题讨论】:

    标签: c# android sockets network-programming


    【解决方案1】:

    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);
    }
    

    【讨论】:

      【解决方案2】:

      您需要使用socket.EnableBroadcast = true 在套接字上启用发送广播消息。那么你应该可以将它们发送到 255.255.255.255 就好了。

      参考:http://msdn.microsoft.com/en-us/library/system.net.sockets.socket.enablebroadcast(v=vs.110).aspx

      【讨论】:

        【解决方案3】:

        通过 wi-fi 有时不允许数据包通过 255.255.255.255 发送,具体取决于其中的安全设置。在运行时查找网络的广播地址并使用它。您可以通过执行以下操作来获取任何网络的广播网络地址。 广播地址 = (系统的 IP 地址 & 网络掩码) & ~网络掩码; 作为替代方案,您应该考虑使用多播地址。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-03-14
          • 1970-01-01
          • 1970-01-01
          • 2016-07-26
          • 2019-06-17
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多