通用 Windows 上的 UDP 套接字未接收数据

Posted

技术标签:

【中文标题】通用 Windows 上的 UDP 套接字未接收数据【英文标题】:UDP socket on Universal Windows not receiving data 【发布时间】:2016-02-18 14:17:22 【问题描述】:

我有一个通过 UDP 套接字接收数据的 WPF 应用程序。现在我需要将它移植到通用 Windows 平台,但是套接字没有接收到传入的数据。

private void Init()

    socket = new Socket(SocketType.Dgram, ProtocolType.Udp);
    socket.Bind(new IPEndPoint(IPAddress.Parse("192.168.0.1"), 55156));

    socketAsyncArgs = new SocketAsyncEventArgs();
    buffer = new byte[4096];
    socketAsyncArgs.SetBuffer(buffer, 0, buffer.Length);
    socketAsyncArgs.Completed += Receive_Completed;


private void Receive()

    bool isPending = socket.ReceiveAsync(socketAsyncArgs);
    if ( ! isPending)
        Receive_Completed(socket, socketAsyncArgs);

永远不会调用Receive_Completed 方法。相同的代码在 WPF 项目中运行良好。我使用 WireShark 来验证数据包的到来。我还尝试使用 Windows.Networking.Sockets.DatagramSocket 得到相同的结果 - 套接字没有收到任何数据。

【问题讨论】:

【参考方案1】:

我找到了解决方案。显然,您必须专门启用该应用程序将接收传入的网络流量。 Visual Studio 中的 UWP 项目包含一个名为 Package.appxmanifest 的文件。双击它,选择 Capabilities 选项卡并检查 Internet (Client & Server)。更多信息请访问MSDN - Networking basics。

【讨论】:

【参考方案2】:

您不必先连接吗?我不关心socket.bind,但你必须在socketAsyncArgs.RemoteEndPoint 中设置IPEndPoint。并且请不要调用 Receive_Completed !!!这是一个应该自动触发的事件。

我用服务器测试了你的代码并且工作正常(但在 TCP 和流模式下)

private void Init()

    socket = new Socket(SocketType.Dgram, ProtocolType.Udp);

    socketAsyncArgs = new SocketAsyncEventArgs();
    socketAsyncArgs.RemoteEndPoint = new IPEndPoint(IPAddress.Parse("192.168.0.1"), 55156);
    buffer = new byte[4096];
    socketAsyncArgs.SetBuffer(buffer, 0, buffer.Length);
    socketAsyncArgs.Completed += Receive_Completed;


private void Receive()

    bool isPending = socket.ConnectAsync(socketAsyncArgs);
    if (!isPending)
        isPending = socket.ReceiveAsync(socketAsyncArgs);

【讨论】:

我想接收数据,而不是发送,所以我使用Bind而不是ConnectReceiveAsync 可以异步执行,在这种情况下,Receive_Completed 偶数处理程序将被调用。但它也可以同步执行,在这种情况下我必须自己调用Receive_Completed。我同意这个机制很奇怪。我知道代码适用于 WPF。我无法让它在 UWP 中工作。 因为它在 UWP 中的工作方式不同。试试这个。在 Receive_Completed 中放置一个断点。做 ConnectAsync。您将看到它将在 Receive_Completed 中中断。然后做 ReceiveAsync 和来自服务器的一些数据。您会看到它会再次中断 Receive_Completed。 连接到我的本地地址/端口?我试过了,Receive_Completed 被调用,接收缓冲区是空的。当我打电话给ReceiveAsync 时,Receive_Completed 不再被调用。我还尝试连接到远程计算机(我知道它的 IP/端口只是因为它是我的测试机器),结果相同。

以上是关于通用 Windows 上的 UDP 套接字未接收数据的主要内容,如果未能解决你的问题,请参考以下文章

如何使用ZeroMQ监听和解析特定端口上的UDP数据?

UDP打孔只能部分工作c#

在 Iphone SDK 上接收带有异步 Udp 套接字的 UPS 包时出现问题

UDP协议在Windows上使用示例

UDP协议在Windows上使用示例

UDP 套接字上的 recvfrom() 返回 -1 但 WSAGetLastError() 返回 0