2008-12-02 13 views
5

UDP no envía ningún ack atrás, pero ¿enviará alguna respuesta?Respuesta UDP

He configurado el programa UDP del servidor cliente. Si le doy al cliente que envíe datos a un servidor que no existe, ¿el cliente recibirá alguna respuesta?

Mi suposición es como;

Cliente -> dirección del servidor de difusión (ARP) servidor -> Respuesta al cliente con su dirección MAC (ARP) cliente envía los datos al servidor (UDP)

En cualquier caso sólo Cliente recibirá ARP respuesta. Si el servidor existe o no, ¿no obtendrá ninguna respuesta UDP?

El cliente está utilizando la función sendto para enviar datos. Podemos obtener información de error después de la llamada a Sendto.

Así que mi pregunta es cómo esta información está disponible cuando el cliente no recibe ninguna respuesta. El código de error se puede obtener de WSAGetLastError.

Intenté enviar datos a un host no existente y enviar a una llamada exitosa. Según la documentación, debe fallar con el valor de retorno SOCKET_ERROR.

¿Alguna idea?

+1

Es un poco preocupante que estés usando UDP y haciéndote esa pregunta. Probablemente signifique que deberías estar usando TCP. –

+0

Me gustaría saber si su host no existente tenía una dirección IP ficticia en la misma subred que el origen del datagrama, o si hubiera estado en el exterior del enrutador. – Guge

Respuesta

6

Nunca puede recibir un error o aviso de un paquete UDP que no llegó al destino.

2

El protocolo UDP se implementa sobre IP. Envía paquetes UDP a hosts identificados por direcciones IP, no direcciones MAC.

Y como se señala, UDP no enviará una respuesta, tendrá que agregar el código para hacerlo usted mismo. Luego tendrá que agregar código para esperar la respuesta, y tomar la acción adecuada si la respuesta se pierde (por lo general, reenviar en un temporizador, hasta que decida que el otro extremo está "muerto"), y así sucesivamente.

3

"UDP es un protocolo sin conexión más simple basado en mensajes. En protocolos sin conexión, no hay esfuerzo realizado para establecer una conexión dedicada de extremo a extremo. La comunicación se logra mediante la transmisión de información en una dirección, desde el origen hasta el destino sin verificar si el destino aún está allí o si está preparado para recibir la información ".

1

Si necesita un UDP confiable como en el pedido o la verificación, de modo que TCP/IP le dará un vistazo a RUDP o UDP confiable. A veces necesita verificación, pero una combinación de UDP y TCP puede retrasarse en la confiabilidad de TCP, lo que causa un cuello de botella.

Para la mayoría de los MMO a gran escala para isntance UDP y Reliablity UDP son el medio de comunicación y fiabilidad. Todo lo que hace RUDP es agregar una porción más pequeña de TCP/IP para validar y ordenar ciertos mensajes, pero no todos.

Una biblioteca común de redes de desarrollo de juegos es Raknet que tiene esto incorporado.

RUDP http://www.javvin.com/protocolRUDP.html

Un ejemplo de RUDP usando RakNet y Python http://pyraknet.slowchop.com/

3

La máquina a la que va a enviar los paquetes pueden responder con un mensaje ICMP inalcanzable puerto UDP.

5

La llamada sendto no falló. El datagrama fue enviado al destino.

El destinatario del datagrama o de algún enrutador en el camino puede devolver una respuesta de error (host inalcanzable, puerto inalcanzable, TTL excedido). Pero la llamada sendto será un historial cuando su sistema la reciba. Algunos sistemas operativos proporcionan una forma de averiguar esto, a menudo con una llamada getsockopt. Pero dado que no puede confiar en obtener una respuesta de error de todos modos ya que depende de las condiciones de la red sobre las que no tiene control, generalmente es mejor ignorarla.

Protocolos razonables superpuestos a las respuestas de uso de UDP. Si no obtiene una respuesta, entonces el otro extremo no obtuvo su datagrama o la respuesta no le devolvió la respuesta.