我目前正在开发一个C#/ Android客户端/服务器项目。
我有一个服务器应用程序,在Windows上运行C#,它在端口8000上发送广播消息。
这个想法是客户端应用程序(Android)接收广播,然后在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
,那么我的设备会收到广播。
因此,我有两个问题。
如果我使用IPAddress.Broadcast,为什么我的设备不接收任何内容,如果这应该是广播的话。
如果192.168.1.255是正确的广播地址,我怎样才能找出动态的地址,想法是服务器将被提供下载所以必须在不同的网络配置上工作192.168.1.255可能不是正确的地址。
设备接收数据包也需要很长时间,服务器每次循环写入控制台并发送广播,但在设备接收之前需要发送大约4或5个广播。它在WIFI网络上,但在所有设备上都有强大的信号,在互联网上下载60mb,在路由器和设备之间下载2ms。
感谢您提供的任何帮助。
答案 0 :(得分: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 :(得分:1)
您需要在socket.EnableBroadcast = true
的套接字上启用发送广播消息。然后你应该可以将它们发送到255.255.255.255就好了。
参考:http://msdn.microsoft.com/en-us/library/system.net.sockets.socket.enablebroadcast(v=vs.110).aspx
答案 2 :(得分:1)
过度wi-fi有时不允许数据包通过255.255.255.255发送,具体取决于其中的安全设置。在运行时查找网络的广播地址&amp;用它。您可以通过执行以下操作获取任何网络的广播网络地址。 broadcastaddress =(ipaddressofthesystem&amp; netmask)&amp; 〜子网掩码; 另外,您应该考虑使用多播地址。