C# UWP应用程序没有';无法从本地主机上的.NET桌面应用程序接收UDP数据报

C# UWP应用程序没有';无法从本地主机上的.NET桌面应用程序接收UDP数据报,c#,sockets,uwp,udp,client-server,C#,Sockets,Uwp,Udp,Client Server,我一直在尝试在UWP应用程序作为客户端和.NET桌面应用程序作为服务器之间设置客户端服务器。我使用UDP数据报作为两者之间的消息传递系统 这里是我的UWP代码,用于侦听端口22222处本地主机IP上的数据报: private async void listenToServer() { // Setup UDP Listener socketListener = new DatagramSocket(); socketListener.MessageReceived +=

我一直在尝试在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);
}
以下是我的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);
}
以下是我尝试过的,以及我从故障排除中了解到的:
  • 将UDP数据报从UWP发送到.NET desktop有效

    通过本地主机端口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();
    }
    
    用于通过相同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));
    
    }
    
  • 将UDP数据报从.NET桌面发送到UWP可跨不同IP(两台不同的计算机)工作

    我已经通过将listener和talker的IP地址设置为服务器运行时的同一IP地址来测试了这一点,并且它可以完美地工作。这项研究的结果让我得到了#3

  • 环回豁免没有什么区别

    运行CheckNetIsolation.exe和环回豁免工具以豁免UWP应用程序受环回IP限制,但无法解决此问题。从我所读到的()来看,在VisualStudio环境中运行应该已经可以避免环回了,但不管怎样,我还是尝试了,而不是运气


  • 尽管这很糟糕,但它还是被微软的设计所阻止

    环回仅允许用于开发目的。用户使用 不支持在Visual Studio外部安装的Windows运行时应用 被允许此外,Windows运行时应用程序只能使用IP环回 作为客户端网络请求的目标地址。那么一扇窗户 使用DatagramSocket或StreamSocketListener来 IP环回地址上的侦听被阻止接收任何 传入的数据包

    资料来源:


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

    正如我在第3点中所说的,即使在具有环回豁免的Visual Studio中,这也不起作用,一定是其他原因。此外,为什么它只能以一种方式工作(UWP到.NET),而不能以另一种方式工作(.NET到UWP)?请再次阅读:“此外,Windows运行时应用程序只能将IP环回用作客户端网络请求的目标地址。因此,使用DatagramSocket或StreamSocketListener侦听IP环回地址的Windows运行时应用程序将无法接收任何传入数据包。“。即使有环回豁免,您也无法绕过此问题。这是否意味着桌面应用程序无法向UWP应用程序发送消息(即使使用TCP套接字)?有。桌面应用程序必须打开TCP套接字并侦听/接受来自该套接字的连接,UWP应用程序必须连接到该套接字。一旦连接,数据可以双向发送。问题是,他们不将127.0.0.1视为环回地址,也不将机器的完整IP地址视为环回地址(如果他们想“安全”,可以将该流量通过防火墙)如果您尝试使用VM等,也会出现问题。人们会对所有关于环回异常的说法感到困惑,这些异常由于另一个无法解释的原因不适用于服务器(侦听)套接字。不知道操作系统如何更安全地满足这些要求,他们只是破坏了UWP应用程序