【问题标题】:Send UDP with DatagramSocket on W10 Mobile在 W10 Mobile 上使用 DatagramSocket 发送 UDP
【发布时间】:2016-06-24 08:48:22
【问题描述】:

问题

我无法将 UDP 消息从我的 Wi-Fi 连接手机上的 UWP 应用发送到桌面计算机上的侦听器。

上下文

手机上的 UWP 应用必须将数据发送到网络上其他地方的进程。

  • 手机运行 Windows 10 移动版。
  • 手机通过Wi-Fi连接到网络,地址为192.168.1.10
  • 监听器(接收进程)位于通过以太网线连接的桌面计算机上,地址为 192.168.1.3
  • 已知接收器可以工作。当使用 WinForms 和 UdpClient 构建的测试工具将数据报发送到 192.168.1.3:1967 时,侦听器会做出适当的响应。
  • 这不是防火墙问题,我尝试在侦听主机上禁用 Windows 防火墙。
  • 我已阅读文档并查看了 msdn 上的示例应用程序。
  • 我的应用清单指定了网络访问。 (当我尝试部署并为我修复它时,VS2015 发现了这个问题。)

我可以远程调试手机上运行的应用程序。它执行 WriteString 调用时不会发生意外,但 Wireshark 没有报告应该生成的 UDP 流量。

这是问题代码的示例。为简单起见,侦听器的 IP 地址是硬编码的,并且在测试时已知是正确的。电话在网络上,并在测试前立即响应 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 几乎没有代码工作或后果。

甚至可能需要这样做以支持网络限制和方便管理(客户反馈)。因此,看似简单的事情的任意复杂化实际上是一个非常精明的设计。

【问题讨论】:

    标签: udp uwp


    【解决方案1】:

    尝试调用await w.StoreAsync() 来实际发送比特。

    【讨论】:

    • 非常感谢。该文档明确指出,每次写入都会发送一个数据包。我错误地将其解释为对 WriteXxxAsync 的调用,但由于对 store 的调用导致发送数据包,因此我尝试了对 WriteStringAsync 的三个调用,然后是对 StoreAsync 的调用。这将产生一个具有级联数据的数据报。因此,“写入”实际上是指“写入流,在调用 StoreAsync 之前 DataWriter 不会这样做。”
    猜你喜欢
    • 2021-12-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-11
    • 1970-01-01
    • 2014-09-07
    • 2012-04-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多