UWP 应用程序未从本地主机上的 .NET 桌面应用程序接收 UDP 数据报

Sam*_*chi 5 c# sockets udp client-server uwp

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

这里是我的 UWP 代码,用于在端口 22222 的本地主机 IP 上侦听数据报:

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);
}
Run Code Online (Sandbox Code Playgroud)

这是我的 WinForm .NET 桌面应用程序,用于在端口 2222 上的本地主机上发送数据报:

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);
}
Run Code Online (Sandbox Code Playgroud)

以下是我的尝试以及我从故障排除中了解到的信息:

  1. UWP 向 .NET 桌面发送 UDP 数据报是可行的

    通过本地主机端口 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();
    }
    
    Run Code Online (Sandbox Code Playgroud)

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

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

    我已经通过将侦听器和发话器 IP 地址设置为服务器运行时的同一 IP 地址来对此进行了测试,并且它工作完美。这导致了我的研究,让我达到了#3......

  3. 环回豁免没有什么区别

    运行 CheckNetIsolation.exe 和环回豁免工具来使 UWP 应用免受环回 IP 限制并不能解决此问题。从我读到的( Windows 10.UWP 中的 UDP 问题)看来,这似乎并不重要,在 Visual Studio 环境中运行应该已经可以免除环回,但我还是尝试了,但运气不佳。

Sun*_*ius 4

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

仅允许出于开发目的环回。不允许在 Visual Studio 外部安装的 Windows 运行时应用程序使用。此外,Windows 运行时应用程序只能使用 IP 环回作为客户端网络请求的目标地址。因此,使用 DatagramSocket 或 StreamSocketListener 侦听 IP 环回地址的 Windows 运行时应用程序将无法接收任何传入数据包。

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

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