2008-12-02 18 views
5

UDP ne renvoie aucun accusé de réception, mais envoie-t-il une réponse?Réponse UDP

J'ai configuré le programme UDP du serveur client. Si je donne au client d'envoyer des données à un serveur inexistant, le client recevra-t-il une réponse?

Ma supposition est comme;

client -> adresse du serveur de diffusion (ARP) serveur -> Répondre au client avec son adresse MAC (ARP) client envoie des données au serveur (UDP)

En tout client de cas ne recevra ARP réponse. Si le serveur existe ou non, il n'obtiendra aucune réponse UDP?

Le client utilise la fonction sendto pour envoyer des données. Nous pouvons obtenir des informations d'erreur après sendto call.

Donc, ma question est de savoir comment cette information est disponible lorsque le client ne reçoit aucune réponse. Le code d'erreur peut provenir de WSAGetLastError.

J'ai essayé d'envoyer des données à un hôte inexistant et l'appel sendto a réussi. Selon la documentation, il devrait échouer avec la valeur de retour SOCKET_ERROR.

Des pensées?

+1

Il est légèrement inquiétant que vous utilisiez UDP et que vous posiez cette question. Cela signifie probablement que vous devriez utiliser TCP. –

+0

Je voudrais savoir si votre hôte inexistant avait une adresse IP fictive dans le même sous-réseau que l'origine du datagramme, ou si elle aurait été à l'extérieur du routeur. – Guge

Répondre

6

Vous ne pouvez jamais recevoir d'erreur ou de notification pour un paquet UDP qui n'a pas atteint la destination.

2

Le protocole UDP est implémenté sur IP. Vous envoyez des paquets UDP aux hôtes identifiés par des adresses IP, pas des adresses MAC.

Et comme indiqué, UDP lui-même n'enverra pas de réponse, vous devrez ajouter du code pour le faire vous-même. Ensuite, vous devrez ajouter du code pour attendre la réponse, et prendre l'action appropriée si la réponse est perdue (typiquement renvoyer sur un temporisateur, jusqu'à ce que vous décidiez que l'autre extrémité soit "morte"), et ainsi de suite.

3

« UDP est un protocole sans connexion à base de messages plus simple. Dans les protocoles sans connexion, il n'y a pas d'effort fait pour mettre en place une connexion de bout en bout dédiée. La communication est réalisée en transmettant des informations dans une direction, de la source à la destination sans vérifier si la destination est toujours là, ou si elle est prête à recevoir l'information. "

1

Si vous avez besoin d'UDP fiable comme lors de la commande ou de la vérification, TCP/IP vous donnera un aperçu de RUDP ou de UDP fiable. Parfois, vous avez besoin d'une vérification, mais un mélange d'UDP et de TCP peut être bloqué sur la fiabilité TCP, causant un goulot d'étranglement.

Pour la plupart des MMO à grande échelle, UDP et Reliablity UDP sont les moyens de communication et de fiabilité. Tout ce que fait RUDP est d'ajouter une plus petite portion de TCP/IP pour valider et commander certains messages mais pas tous.

Une bibliothèque réseau de développement de jeux commune est Raknet qui a ce intégré.

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

Un exemple de RUDP en utilisant Raknet et Python http://pyraknet.slowchop.com/

3

La machine à laquelle vous envoyez des paquets peut répondre avec un port UDP ICMP injoignable.

5

L'appel sendto n'a pas échoué. Le datagramme a été envoyé à la destination.

Le destinataire du datagramme ou d'un routeur sur le chemin de celui-ci peut renvoyer une réponse d'erreur (hôte inaccessible, port inaccessible, TTL dépassé). Mais l'appel sendto sera l'historique au moment où votre système le reçoit. Certains systèmes d'exploitation fournissent un moyen de savoir ce qui s'est produit, souvent avec un appel getsockopt. Mais comme vous ne pouvez pas compter sur une réponse d'erreur car cela dépend des conditions du réseau sur lesquelles vous n'avez aucun contrôle, il est généralement préférable de l'ignorer.

Les protocoles intelligents superposés au protocole UDP utilisent des réponses. Si vous n'obtenez pas de réponse, l'autre extrémité n'a pas reçu votre datagramme ou la réponse ne vous a pas été renvoyée.