[预编码]
PC1(Windows): 局域网地址:10.0.1.11 无线网络地址:10.0.1.10
PC2(Windows): 无线网络地址:10.0.1.4
[一步一步我做了什么以及我得到了什么结果]
发送广播消息的源码如下所示:
Socket sendSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
// Use GetHostAddresses() to enumerate the local IPAddress
string hostName = Dns.GetHostName();
var addressList = Dns.GetHostAddresses(hostName);
foreach (var ip in addressList)
{
if (ip.AddressFamily != AddressFamily.InterNetwork) { continue; }
IPEndPoint ep = null;
IPAddress ipSend = null;
ipSend = IPAddress.Parse(ip.ToString());
ipSend.Address |= 0xFF000000;
ep = new IPEndPoint(ipSend, 1020);
sendSocket.SendTo(broadcastMessage, ep);
}
//Use GetAllNetworkInterfaces() to enumerate the local IPAddress
NetworkInterface[] nics = NetworkInterface.GetAllNetworkInterfaces();
foreach (NetworkInterface adapter in nics)
{
if (adapter.NetworkInterfaceType == NetworkInterfaceType.Ethernet ||
adapter.NetworkInterfaceType == NetworkInterfaceType.Wireless80211)
{
IPInterfaceProperties ip = adapter.GetIPProperties();
UnicastIPAddressInformationCollection ipCollection = ip.UnicastAddresses;
foreach (UnicastIPAddressInformation ipadd in ipCollection)
{
if (ipadd.Address.AddressFamily == AddressFamily.InterNetwork)
{
IPEndPoint ep = null;
IPAddress ipSend = null;
ipSend = IPAddress.Parse(ipadd.Address.ToString());
ipSend.Address |= 0xFF000000;
ep = new IPEndPoint(ipSend, 1020);
sendSocket.SendTo(broadcastMessage, ep);
}
}
}
}
//Use GetHostEntry() to enumerate the local IPAddress
IPHostEntry host = Dns.GetHostEntry(hostName, AddressFamily.InterNetwork);
foreach (var ip in host.AddressList)
{
IPEndPoint ep = null;
IPAddress ipSend = null;
ipSend = IPAddress.Parse(ip.ToString());
ipSend.Address |= 0xFF000000;
ep = new IPEndPoint(ipSend, 1020);
sendSocket.SendTo(broadcastMessage, ep);
}
我尝试了3种方法来枚举本地IP地址,然后制作广播地址。但他们都失败了。
看来,当网络从 LAN 变为 Wifi 后,SendTo() api 调用的广播消息没有经过 PC1 上的 TCP 层(否则 Wireshark 包会有信息)。
你们有关于这个问题的任何信息吗?提前非常感谢。
UDP接收器源代码如图所示。
socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, 1);
socket.Bind(new IPEndPoint(IPAddress.Any, 1020));
socket.ReceiveTimeout = 100;
_udpReceiver = new UdpClient{Client = socket};
_udpReceiver.Client.ReceiveBufferSize = 1024 * 1024;
endPoint = new IPEndPoint(IPAddress.Any, 0);
while (!_stopReceiveEvent.WaitOne(1))
{
byte[] rawBytes = _udpReceiver.Receive(ref endPoint);
if (rawBytes.Length <= 0){ continue; }
string receivedDeviceIPAddr = endPoint.Address.ToString();
Console.WriteLine($"Recieve UDP response from {receivedDeviceIPAddr} : {endPoint.Port}");
}
您不应该搞乱 DNS 名称和主机名。
而是从
IPAddress.Any
发送广播,并将其发送到 IPAddress.Broadcast
。
操作系统将选择最合适的适配器和原始地址来进行传输。