c# udp

c# - Ejemplo UDP simple para enviar y recibir datos del mismo socket



(2)

Por alguna razón, me está costando enviar y recibir datos del mismo socket. De todos modos aquí está mi código de cliente:

var client = new UdpClient(); IPEndPoint ep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 11000); // endpoint where server is listening (testing localy) client.Connect(ep); // send data client.Send(new byte[] { 1, 2, 3, 4, 5 }, 5); // then receive data var receivedData = client.Receive(ref ep); // Exception: An existing connection was forcibly closed by the remote host

Básicamente quiero crear un protocolo donde envíe un paquete udp y luego espero una respuesta. Al igual que el protocolo HTTP para cada solicitud, hay una respuesta. Este código funciona si el servidor está en una computadora diferente. Sin embargo, puede ser que el servidor y el cliente estén en la misma computadora.

Aquí está el servidor:

UdpClient udpServer = new UdpClient(UDP_LISTEN_PORT); while (true) { var groupEP = new IPEndPoint(IPAddress.Any, 11000); // listen on any port var data = udpServer.Receive(ref groupEP); udpServer.Send(new byte[] { 1 }, 1); // if data is received reply letting the client know that we got his data }

Editar

La razón por la que no puedo usar tcp es porque a veces el cliente está detrás de un NAT (enrutador) y es más fácil hacer perforaciones UDP que TCP.

Solución:

gracias a la respuesta de Markmnl aquí está mi código:

Servidor:

UdpClient udpServer = new UdpClient(11000); while (true) { var remoteEP = new IPEndPoint(IPAddress.Any, 11000); var data = udpServer.Receive(ref remoteEP); // listen on port 11000 Console.Write("receive data from " + remoteEP.ToString()); udpServer.Send(new byte[] { 1 }, 1, remoteEP); // reply back }

Codigo del cliente:

var client = new UdpClient(); IPEndPoint ep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 11000); // endpoint where server is listening client.Connect(ep); // send data client.Send(new byte[] { 1, 2, 3, 4, 5 }, 5); // then receive data var receivedData = client.Receive(ref ep); Console.Write("receive data from " + ep.ToString()); Console.Read();


(Supongo que es consciente de que el uso de UDP (User Datagram Protocol) no garantiza la entrega, verifica si hay duplicados y control de la congestión, y simplemente responderá a su pregunta).

En tu servidor esta línea:

var data = udpServer.Receive(ref groupEP);

reasigna groupEP de lo que tenía a la dirección en la que recibe algo.

Esta línea:

udpServer.Send(new byte[] { 1 }, 1);

No funcionará ya que no ha especificado a quién enviar los datos. (Funciona en su cliente porque llamó a connect, lo que significa que el envío siempre será enviado al punto final al que se conectó, por supuesto que no queremos eso en el servidor ya que podríamos tener muchos clientes). Me gustaría:

UdpClient udpServer = new UdpClient(UDP_LISTEN_PORT); while (true) { var remoteEP = new IPEndPoint(IPAddress.Any, 11000); var data = udpServer.Receive(ref remoteEP); udpServer.Send(new byte[] { 1 }, 1, remoteEP); // if data is received reply letting the client know that we got his data }

Además, si tiene el servidor y el cliente en la misma máquina, debe tenerlos en diferentes puertos.


Bueno, hay métodos para hacer esto, supongo, pero ninguno parece garantizar que hayas entendido bien el mensaje, puedes usar sumas de verificación para verificar si el mensaje recibido es el correcto He hecho un diagrama con una idea de cómo puedes haz que esto funcione, con suerte, entenderás algo: D