我正在通过 C# 的 UdpClient 类为我的大学作业实现网络连接(也使用 UWP,这很重要)。 一开始我只是想通过发送消息来测试一下:
async private void HostButtonClicked(object sender, RoutedEventArgs e)
{
// ....some UI-related code
NetworkManager.client = new UdpClient(5555);
NetworkManager.client.EnableBroadcast = true;
var result = await NetworkManager.client.ReceiveAsync();
message = Encoding.UTF8.GetString(result.Buffer);
// ....UI code omitted for brevity
}
async private void SendMessage(object sender, RoutedEventArgs e)
{
string ipString = InputIP.Text;
message = InputText.Text;
NetworkManager.client = new UdpClient();
NetworkManager.client.EnableBroadcast = true;
byte[] data = Encoding.UTF8.GetBytes(message);
IPEndPoint remotePoint;
try
{
remotePoint = new IPEndPoint(IPAddress.Parse(ipString), 5555);
}
catch (FormatException exception)
{
return;
}
await NetworkManager.client.SendAsync(data, data.Length, remotePoint);
}
代码说明:这是两种排除方法。如果一个被调用,另一个则不会(菜单中有一个选择,例如发送/接收消息)。因此,即使要测试应用程序,也需要至少打开2个副本
我在电脑上测试时效果很好。
然后,当我尝试在同一 LAN 内的多台计算机上或通过 ZeroTier(提供虚拟 LAN 的应用程序)测试它时,由于某种原因它不起作用,即使数据是在 Wireshark 中发送/接收的,但未读取通过应用程序。
接收端Wireshark捕获示例(通过ZeroTier网络接口): 。
在发送端可以看到相同的情况(尽管当我尝试从笔记本电脑或任何其他设备发送消息时未用于开发此应用程序,它甚至不发送它,这意味着没有wireshark活动,看起来就像奇怪的 Windows 行为,甚至不让应用程序发送数据!所以现在我仅限于从我的主 PC 发送到其他人,或使用一些第三方应用程序行ncat),这意味着它是不是网络问题。
这可能是防火墙或UAC问题,但我已经尝试禁用它们,但没有效果。也不应该是网络问题,因为双方 Wireshark 都会捕获传入/传出数据包。
也许问题出在Windows对UWP应用程序的处理上(我的意思是Windows将它们放在沙箱中)?但这只是我的猜测