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

时间:2016-02-18 14:17:23

标签: c# sockets networking udp win-universal-app

我有一个通过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得到相同的结果 - 套接字没有收到任何数据。

2 个答案:

答案 0 :(得分:1)

我找到了解决方案。显然,您必须专门启用应用程序将接收传入的网络流量。 Visual Studio中的UWP项目包含名为Package.appxmanifest的文件。双击它,选择功能选项卡并检查Internet(客户端和服务器)。有关MSDN - Networking basics的更多信息。

答案 1 :(得分:0)

你不必先连接吗?我不关心socket.bind,但你必须在IPEndPoint中设置一个socketAsyncArgs.RemoteEndPoint。请不要致电Receive_Completed !!!它应该自动触发它。

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

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);
}