Question

Pour ma mission Uni Je dois créer une action rapide jeu rythmé en réseau et ont donc choisi d'utiliser UDP plutôt que TCP. Je suis au courant d'un grand nombre de différences dans la programmation à la fois UDP et TCP et avoir lu dans la plupart des parties pertinentes de la documentation MSDN sur winsock. Sur MSDN elle indique que la création d'une connexion UDP via la fonction de connexion () doit se lier à la douille à l'adresse et le port spécifié et par conséquent être utilisé en mesure l'envoi () et recv () avec la douille créé.

Pour ma demande, je créer un client et utiliser connect () en utilisant l'adresse de réalimentation qui envoie un certain nombre de paquets via la fonction d'envoi (). Le client, après avoir appelé select (), reçoit alors les paquets qu'il a envoyé. Toutefois, le résultat que je reçois de la fonction recv () est SOCKET_ERROR et la description d'erreur en utilisant WSAGetLastError () est « une connexion existante a été fermée de force par l'hôte distant ».

Si j'utilise la liaison pour envoyer des données sur l'adresse de réalimentation, je paquets recv () fonction () et l'utilisation sendto () sans erreur ... Quelqu'un sait-il pourquoi la fonction connect () ne fait pas ce qu'il est censé faire, et a été quelqu'un capable d'utiliser les sockets UDP avec la fonction connect ()?

Était-ce utile?

La solution

Vous devrez appeler bind () si vous voulez que votre programme pour recevoir des paquets UDP. connect () définit uniquement l'adresse que le socket envoie des paquets à envoyer si vous appelez (); il n'associe pas la prise avec un port UDP local pour recevoir le; pour que vous devez appeler bind ().

Autres conseils

Points « réseau UNIX de programmation » qu'un appel à la connexion faite sur un chiffres socket côté client UDP et mémorise ainsi tout l'état sur l'adresse de prise de destination à l'avance (masquage, interface de sélection, etc.), économiser le coût de faire ainsi de suite à chaque appel :: sendto. Ce livre prétend que :: envoyer vs :: sendto peut être jusqu'à 3 fois plus rapide en raison de cette réduire les frais généraux - les données peuvent aller directement au pilote de carte réseau sans passer par la plupart des traitements de la pile IP. jeu de haute performance programmeur peut vouloir examiner cette question.

vous devriez vérifier Guide de Beej au réseau de programmation utilisant une connexion Internet filaire , il y a des beaux exemples qui répondent à vos question.

Gardez à l'esprit que le protocole UDP est un « connexion » sens du protocole que vous jamais connecté à l'hôte, vous qu'envoyer des données. Ainsi, vous pouvez voir que comme une action de connexion n'a pas de sens pour UDP.

Pour UDP, vous devez utiliser sendto () et recvfrom () dans ces fonctions que vous spécifiez l'adresse et les tampons et qui est à ce sujet, tout ce qui est confortablement géré pour vous dans TCP est allé vous devez les choses de poignée sur votre propre .

Dans la documentation MSDN mentionné son que vous pouvez en effet utiliser une certaine façon les fonctions d'émission / RECV normales avec UDP, mais pourquoi voulez-vous lorsque vous avez déjà des fonctions distinctes? Comme d'autres déjà commenté connect () pour UDP fait autre chose ce n'est pas essentiellement une opération de « connexion », mais une sorte d'un filtre pour mettre en place send () / recv () pour l'utilisation UDP.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top