在 W10 Mobile 上使用 DatagramSocket 发送 UDP
Send UDP with DatagramSocket on W10 Mobile
问题
我无法从连接到 phone 的 Wi-Fi 上的 UWP 应用向桌面计算机上的侦听器发送 UDP 消息。
上下文
phone 上的 UWP 应用程序必须将数据发送到网络上其他位置的进程。
- phone 运行 Windows 10 手机。
- phone已通过 Wi-Fi 连接到网络,地址为 192.168.1.10
- 监听器(接收进程)在一台通过网线连接的台式电脑上,地址为192.168.1.3
- 已知接收器可以工作。当使用 WinForms 和 UdpClient 构建的测试工具向 192.168.1.3:1967 发送数据报时,侦听器会适当响应。
- 这不是防火墙问题,我尝试在侦听主机上禁用 Windows 防火墙。
- 我已阅读文档并查看了 msdn 上的示例应用程序。
- 我的应用程序清单指定了网络访问权限。 (VS2015 在我尝试部署并为我修复它时选择了它。)
我可以在 phone 上远程调试应用程序 运行。它执行 WriteString 调用而没有发生意外,但 Wireshark 没有报告应该生成的 UDP 流量。
这是问题代码的示例。为简单起见,侦听器的 IP 地址是硬编码的,并且在测试时已知是正确的。 phone 在网络上并在测试前立即响应 192.168.1.10 的 ping。
DatagramSocket _ds = new DatagramSocket();
HostName _hostname = new HostName("192.168.1.3");
private async void Grid_DoubleTapped(object sender, DoubleTappedRoutedEventArgs e)
{
using (var w = new DataWriter(await _ds.GetOutputStreamAsync(_hostname, "1967")))
w.WriteString("CC");
Debug.WriteLine("CC");
}
附录
Peter Torr 的回答和我对此的评论为本附录提供了上下文。
有人可能想知道为什么任何理智的人都会将流包装在像数据报这样的小有效负载一次性的东西周围。在数天抱怨这是多么愚蠢之后,我终于明白,它迫使我以一种不对传输做出假设的方式编写我的代码:我可以切换到 TCP,几乎没有代码工作或后果。
甚至可能需要执行此操作以支持网络限制和方便的管理(客户反馈)。所以看似简单事物的任意复杂化实际上是一个非常精明的设计。
尝试调用 await w.StoreAsync()
实际发送位。
问题
我无法从连接到 phone 的 Wi-Fi 上的 UWP 应用向桌面计算机上的侦听器发送 UDP 消息。
上下文
phone 上的 UWP 应用程序必须将数据发送到网络上其他位置的进程。
- phone 运行 Windows 10 手机。
- phone已通过 Wi-Fi 连接到网络,地址为 192.168.1.10
- 监听器(接收进程)在一台通过网线连接的台式电脑上,地址为192.168.1.3
- 已知接收器可以工作。当使用 WinForms 和 UdpClient 构建的测试工具向 192.168.1.3:1967 发送数据报时,侦听器会适当响应。
- 这不是防火墙问题,我尝试在侦听主机上禁用 Windows 防火墙。
- 我已阅读文档并查看了 msdn 上的示例应用程序。
- 我的应用程序清单指定了网络访问权限。 (VS2015 在我尝试部署并为我修复它时选择了它。)
我可以在 phone 上远程调试应用程序 运行。它执行 WriteString 调用而没有发生意外,但 Wireshark 没有报告应该生成的 UDP 流量。
这是问题代码的示例。为简单起见,侦听器的 IP 地址是硬编码的,并且在测试时已知是正确的。 phone 在网络上并在测试前立即响应 192.168.1.10 的 ping。
DatagramSocket _ds = new DatagramSocket();
HostName _hostname = new HostName("192.168.1.3");
private async void Grid_DoubleTapped(object sender, DoubleTappedRoutedEventArgs e)
{
using (var w = new DataWriter(await _ds.GetOutputStreamAsync(_hostname, "1967")))
w.WriteString("CC");
Debug.WriteLine("CC");
}
附录
Peter Torr 的回答和我对此的评论为本附录提供了上下文。
有人可能想知道为什么任何理智的人都会将流包装在像数据报这样的小有效负载一次性的东西周围。在数天抱怨这是多么愚蠢之后,我终于明白,它迫使我以一种不对传输做出假设的方式编写我的代码:我可以切换到 TCP,几乎没有代码工作或后果。
甚至可能需要执行此操作以支持网络限制和方便的管理(客户反馈)。所以看似简单事物的任意复杂化实际上是一个非常精明的设计。
尝试调用 await w.StoreAsync()
实际发送位。