Pregunta

Para mi asignación Uni tengo que crear una acción de ritmo rápido de juego en red y así han optado por utilizar UDP en lugar de TCP. Soy consciente de una gran cantidad de las diferencias en la programación de UDP y TCP y leído por la mayoría de las partes pertinentes de la documentación de MSDN en Winsock. En MSDN se afirma que la creación de un socket UDP a través de la función connect () debe enlazar el conector a la dirección y el puerto especificado y como consecuencia ser capaz de utilizar el send () y recv () funciones con el socket creado.

Para mi aplicación crear un cliente y utilizar connect () usando la dirección de bucle de retorno que envía una serie de paquetes a través de la función send (). El cliente, después de llamar a select (), y luego recibe los paquetes que envía. Sin embargo el resultado que recibo de la recv () es SOCKET_ERROR y la descripción del error usando WSAGetLastError () es "una conexión existente forzosamente fue cerrada por el host remoto".

Si utilizo el bind () la función y el uso sendto () para enviar datos a través de la dirección de bucle de retorno, que recv () paquetes sin errores ... ¿alguien sabe por qué la función connect () no está haciendo lo que es supone que debe hacer, y nadie ha sido capaz de utilizar sockets UDP con la función connect ()?

¿Fue útil?

Solución

Usted tendrá que llamar a bind () si desea que su programa para recibir paquetes UDP. connect () sólo establece la dirección que la toma enviará paquetes a si se llama a send (); la que no asocia el zócalo con un puerto UDP local para recibir sucesivamente; para eso se debe llamar a bind ().

Otros consejos

"Programación de Red UNIX" señala que una llamada de conexión hecha en un socket figuras lado del cliente UDP y tiendas de todo el estado acerca de la dirección de socket de destino con antelación (enmascaramiento, la interfaz de selección, etc.), ahorrando el costo de hacer por lo que en cada llamada sendto ::. Este libro afirma que :: Enviar :: vs sendto puede ser hasta 3x más rápido debido a esta reducción de gastos generales - los datos pueden ir directamente al controlador de la NIC sin pasar por la mayoría de procesamiento de pila IP. de alto rendimiento del juego programador pueden considerar esto.

Guía de Programación Beej red utilizando Internet sockets , hay un bonito ejemplos que se ocupan de su cuestión.

Tenga en cuenta que el protocolo UDP es un " conexión " protocolo significado que nunca jamás se conectan al host, que apenas envía datos. Así se puede ver que la conexión como una acción no tiene sentido para UDP.

Para UDP que debe usar sendto () y recvfrom () en estas funciones se especifica la dirección y los tampones y eso es todo, todo lo que está cómodamente manejado para usted en TCP se ha ido usted tiene que cosas manejar por su cuenta .

En la documentación de MSDN su mencionó que se puede, de hecho, de alguna manera utilizar las funciones normales de envío / recv con UDP, pero ¿por qué cuando usted tiene funciones separadas ya? Al igual que otros comentaron que ya connect () para UDP hace otra cosa que no es esencialmente una operación de "conexión", sino una especie de filtro para configurar send () / recv () para el uso de UDP.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top