2009-09-18 6 views
8

J'écris un programme simple client-serveur.comment différencier si le client utilise TCP ou UDP du côté serveur

Le client envoie des messages au serveur en utilisant UDP ou TCP. Le serveur doit pouvoir supporter à la fois UDP et TCP.

Si le client envoie un message en utilisant UDP, la séquence d'appels de méthode dans le client est socket(),bind(),sendto(),recvfrom(),close() et celle du serveur est socket(),bind(),sendto(),recvfrom(),close(). S'il utilise TCP, séquence d'appel dans le serveur est socket(),bind(),listen(),accept(),send(),recv(),close(). et que le client est socket(),bind(),connect(),send(),recv(),close()

Dans mon programme, l'utilisateur/client est donné le choix au début de choisir ce qu'il veut utiliser UDP ou TCP. Donc, mon principal problème est comment puis-je savoir ou différencier dans le côté serveur, si le client envoie un message en utilisant TCP ou UDP. S'il utilise TCP, je dois appeler listen(), accepter(), send(), recv() et s'il utilise UDP, je n'appelle pas listen(), n'accepte pas() mais appelle sendto() et recvfrom (). Donc, comment puis-je différencier/savoir ceci au début afin que je puisse faire des appels de fonction appropriés.

Merci.

+1

Donc, devrais-je créer deux sockets côté serveur, une pour UDP et une autre pour TCP? –

+0

seg.server.fault, oui. –

+2

@ seg.server.fault: Je recommanderais _not_ calling 'bind()' dans votre code client. Bien que cela soit techniquement possible (et requis dans des situations très spécifiques), le comportement par défaut sans un côté client 'bind()' est généralement ce que vous voulez dans la couche application. De plus, gardez à l'esprit que vous pouvez appeler 'connect()' sur un socket UDP. Il ne fait aucun handshaking, mais cela signifie que vous pouvez utiliser 'send/recv' au lieu de' sendto/recvfrom', ce qui peut rendre la logique du client plus simple. – Tom

Répondre

15

Avant le paquet vous atteint, vous ne savez pas que ce soit UDP ou TCP.

Donc, vous voulez lier à la fois les sockets UDP et TCP si vous attendez des demandes dans les deux sens. Une fois que vous l'avez fait, vous savez simplement de quelle manière il est venu par le socket que vous avez reçu le paquet.

1

laisser le socket TCP écouter sur le port X et faire les connexions via le port UDP Y

+6

vous pouvez écouter en toute sécurité sur UDP et TCP sur le même port. –

5

Lorsque vous créez la prise, vous passez un type - SOCK_STREAM (TCP) ou SOCK_DGRAM (UDP)

Ainsi, les deux types de trafic seront sur deux prises différentes.

+0

Cela n'aide pas le côté serveur. L'OP sait déjà que le côté client décidera de TCP par rapport à UDP. Le problème est de les supporter à la fois du côté serveur, et c'est beaucoup plus d'effort que de simplement changer le type de socket. – Tom

Questions connexes