usar socket servidor multiple con como clients asincrono c# sockets uwp udp client-server

servidor - socket tcp c#



La aplicaciĆ³n UWP no recibe UDP Datagram desde una aplicaciĆ³n de escritorio.NET en localhost (1)

Por mucho que esto apesta, está bloqueado por diseño de Microsoft.

El bucle invertido solo se permite con fines de desarrollo. No se permite el uso de una aplicación de Windows Runtime instalada fuera de Visual Studio. Además, una aplicación de Windows Runtime puede usar un loopback de IP solo como la dirección de destino para una solicitud de red del cliente. Por lo tanto, se impide que una aplicación de Windows Runtime que utiliza un DatagramSocket o StreamSocketListener para escuchar en una dirección de bucle invertido IP reciba paquetes entrantes.

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

La mejor solución que puede hacer es usar sockets TCP y conectarse desde la aplicación UWP a su aplicación de escritorio (no al revés).

He intentado configurar un servidor cliente entre una aplicación UWP como cliente y una aplicación de escritorio .NET como servidor. Estoy usando UDP Datagrams como el sistema de mensajería entre los dos.

Aquí mi código UWP para escuchar datagramas en la IP del host local en el puerto 22222:

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

Aquí está mi aplicación de escritorio WinForm .NET para enviar Datagrams en localhost en el puerto 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); }

Esto es lo que he intentado, y lo que sé de mi solución de problemas:

  1. El envío de un datagrama UDP desde UWP al escritorio .NET funciona sobre el puerto localhost 11111

    Código UWP para enviar mensajes al escritorio .NET:

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

    Código de escritorio .NET para escuchar el mensaje de UWP en la misma IP y puerto:

    private async Task listenToClient() { // Setup listener listener = new UdpClient(11111); UdpReceiveResult receiveResult = await listener.ReceiveAsync(); Debug.WriteLine(" Received: " + Encoding.ASCII.GetString(receiveResult.Buffer)); }

  2. El envío de UDP Datagram desde el escritorio .NET a UWP funciona en diferentes direcciones IP (2 computadoras diferentes)

    Probé esto al establecer las direcciones IP del oyente y del hablante en la misma dirección IP donde se estaba ejecutando el servidor, y funciona sin problemas. Esto condujo a una investigación que me llevó al # 3 ...

  3. La exención de bucle invertido no hizo la diferencia

    La ejecución de CheckNetIsolation.exe y la herramienta de exención de bucle invertido para eximir a la aplicación UWP de la restricción de IP de bucle invertido no solucionó este problema. Parece que no debería importar, por lo que leí ( Problemas con UDP en Windows 10. UWP ), ejecutar en el entorno de Visual Studio ya debería estar exento de loopback, pero lo intenté de todos modos, y no la suerte.