发送广播包问题

本文关键字:问题 包问题 广播 | 更新日期: 2023-09-27 18:09:09

我目前正在做一个c#/Android客户端/服务器项目。

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

这个想法是客户端应用程序(Android)接收广播,然后显示服务器主机名和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。广播它说它是255.255.255.255,但我的设备从未接收到广播。

如果我将端点硬编码为192.168.1.255,则我的设备接收广播。

因此,我有两个问题。

  1. 如果我使用IPAddress。广播为什么我的设备接收不到任何东西,如果这应该是广播。

  2. 如果192.168.1.255是正确的广播地址,我如何才能动态地找出地址应该是什么,这个想法是服务器将提供下载,因此必须在不同的网络配置上工作,其中192.168.1.255可能不是正确的地址。

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

发送广播包问题

Windows 7以不同的方式处理255.255.255.255广播。在Windows 7上发送UDP广播

使用子网广播代替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);
}

需要使用socket.EnableBroadcast = true使能socket发送广播消息。然后你应该可以把它们发送到255.255.255.255就好了。

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

Over wi-fi有时不允许数据包通过255.255.255.255发送,这取决于它的安全设置。在运行时查找网络的广播地址&使用它。通过执行以下操作,可以获得任意网络的广播网络地址。Broadcastaddress = (ipaddressofsystem&子网掩码),~子网掩码;另外,您应该考虑使用多播地址。