UWP应用程序不从localhost上的.NET桌面应用程序接收UDP数据报

时间:2017-07-08 20:49:32

标签: c# sockets uwp udp client-server

我一直在尝试在作为客户端的UWP应用程序和作为服务器的.NET桌面应用程序之间设置客户端服务器。我正在使用UDP数据报作为两者之间的消息传递系统。

这是我的UWP代码,用于在端口22222上侦听localhost IP上的Datagrams:

private async void listenToServer()
{
    // Setup UDP Listener
    socketListener = new DatagramSocket();
    socketListener.MessageReceived += MessageReceived;

    await socketListener.BindEndpointAsync(new HostName("127.0.0.1"),"22222");
    Debug.WriteLine("Listening: " + socketListener.Information.LocalAddress + " " + socketListener.Information.LocalPort);
 }

private async void MessageReceived(DatagramSocket sender, DatagramSocketMessageReceivedEventArgs args)
{
    // Interpret the incoming datagram's entire contents as a string.
    uint stringLength = args.GetDataReader().UnconsumedBufferLength;
    string receivedMessage = args.GetDataReader().ReadString(stringLength);
    Debug.WriteLine("Received " + receivedMessage);
}

这是我的WinForm .NET桌面应用程序,用于在端口2222上的localhost上发送Datagrams:

public async void sendToClient()
{
    // Setup UDP Talker
    talker = new UdpClient();
    sending_end_point = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 22222);
    talker.Connect(sending_end_point);

    byte[] send_buffer = Encoding.ASCII.GetBytes("Hello!");
    await talker.SendAsync(send_buffer, send_buffer.Length);
}

这是我尝试过的,以及我从故障排除中得到的知识:

  1. 从 UWP发送UDP数据报到.NET桌面正常工作

    通过localhost端口11111向.NET桌面发送消息的UWP代码:

    public async void sendToServer()
    {
        // Connect to the server
        socketTalker = new DatagramSocket();
        await socketTalker.ConnectAsync(new HostName("127.0.0.1"), "11111");
        Debug.WriteLine("Connected: " + socketTalker.Information.RemoteAddress + " " + socketTalker.Information.RemotePort);
    
        // Setup Writer
        writer = new DataWriter(socketTalker.OutputStream);
        writer.WriteString("Ping!");
    
        await writer.StoreAsync();
    
        writer.DetachStream();
        writer.Dispose();
    }
    

    .NET桌面代码,用于通过相同的IP和端口侦听来自UWP的消息:

    private async Task listenToClient()
    {
        // Setup listener
        listener = new UdpClient(11111);
        UdpReceiveResult receiveResult = await listener.ReceiveAsync();
        Debug.WriteLine(" Received: " + Encoding.ASCII.GetString(receiveResult.Buffer));
    
    }
    
  2. 从不同的IP(2台不同的计算机)将.NET数据报从.NET桌面发送到UWP 工作

    我已经通过将侦听器和讲话者IP地址设置为运行服务器的同一IP地址进行了测试,并且它可以正常运行。这导致了让我进入#3 ...

  3. 的研究
  4. 环回豁免没有什么区别

    运行CheckNetIsolation.exe和Loopback免除工具来免除UWP应用程序的环回IP限制并没有解决这个问题。看起来应该没关系,从我读到的内容(Problems with UDP in windows 10. UWP)来看,在Visual Studio环境中运行应该已经免于环回,但我还是尝试过,而不是运气。

1 个答案:

答案 0 :(得分:2)

尽管这很糟糕,但它被微软设计阻止了。

  

仅允许环回用于开发目的。使用方式   安装在Visual Studio外部的Windows运行时应用程序不是   允许的。此外,Windows运行时应用程序只能使用IP环回   作为客户端网络请求的目标地址。所以一个Windows   使用DatagramSocket或StreamSocketListener的运行时应用程序   监听IP环回地址被阻止接收任何   传入的数据包。

来源:https://msdn.microsoft.com/en-us/library/windows/apps/hh780593.aspx

您可以做的最佳解决方法是使用TCP套接字并从UWP应用程序连接到桌面应用程序(而不是相反)。