【发布时间】: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,那么我的设备就会收到广播。
因此,我有两个问题。
如果我使用 IPAddress.Broadcast,如果这应该是广播的,为什么我的设备收不到任何东西。
1234563可能不是正确的地址。
设备接收数据包也需要很长时间,服务器每次循环都会写入控制台并发送广播,但在设备接收之前大约需要发送 4 或 5 个广播。它在 WIFI 网络上,但所有设备上的信号都很强,互联网上下载 60mb,路由器和设备之间 2 毫秒 ping。
感谢您提供的任何帮助。
【问题讨论】:
标签: c# android sockets network-programming