8
votes

Comment différencier si le client utilise TCP ou UDP du côté serveur

J'écris un programme client-serveur simple.

Le client envoie des messages au serveur à l'aide de UDP ou de TCP. Le serveur doit pouvoir supporter à la fois UDP et TCP.

Si client, envoie un message à l'aide de UDP, la séquence d'appels de méthode dans le client est Socket (), Linge (), SendTo (), RECVFROM (), Fermer () et que dans le serveur est < Code> Prise (), Bind (), SendTo (), RECVFROM (), Fermer () .

S'il utilise TCP, La séquence d'appel dans le serveur est Socket (), Bind (), Listen (), Accepter (), Envoyer (), RECV (), Fermer () . et que dans le client est Socket (), Bind (), Connect (), Envoyer (), RECV (), Fermer ()

Dans mon programme, l'utilisateur / client est donné choix dans le début pour sélectionner ce qu'il veut utiliser UDP ou TCP. Donc, mon problème principal est de savoir comment puis-je savoir ou différencier le serveur si le client envoie un message à l'aide de TCP ou de UDP. S'il utilise TCP, je dois appeler écouter (), accepter (), envoyer (), recv () Et s'il utilise UDP, je n'appelle pas l'écoute (), accepte () mais appelez SendTo () et RECVFROM ().

Alors, comment puis-je différencier / le savoir au début afin que je puisse apporter des appels de fonction appropriés.

Merci.


2 commentaires

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


@ SEG.SERVER.FAULT: Je recommanderais pas appeler Bind () dans votre code client. Bien que ce soit techniquement possible (et requis dans des situations très spécifiques), le comportement par défaut sans la connexion lié ​​() est généralement ce que vous voulez à la couche d'application. N'oubliez pas non plus que vous peut appelez connect () sur une prise UDP. Cela ne fait pas de porte à la main, mais cela signifie que vous pouvez utiliser envoi / recv au lieu de SendTo / Recvrom , qui peut finir par rendre la logique client plus simple.


4 Réponses :


1
votes

Laissez simplement la prise TCP Écouter sur le port X et effectuez les connexions UDP via Port Y


1 commentaires

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



17
votes

Avant que le paquet ne vous atteint, vous ne savez pas si c'est udp ou tcp .

Vous voulez donc se lier aux deux udp et tcp si vous attendez des demandes des deux manières.

Une fois que vous avez fait, vous savez simplement de quelle manière il est venu par la prise, vous avez reçu le paquet.


0 commentaires

6
votes

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

Les deux types de trafic seront sur deux prises différentes.


1 commentaires

Cela n'aide pas le serveur côté serveur. L'OP sait déjà que le côté client décidera TCP vs. UDP. Le problème les apporte à la fois sur le côté serveur, et c'est un effort de manière significative que de simplement changer le type de socket.



2
votes

Tout comme l'a souligné Henry Troup, une prise IP est définie comme

(transport, interface, port).

(UDP, 127.0.0.1, 80) n'est pas la même prise IP que (TCP, 127.0.0.1, 80), vous pouvez ainsi vous attaquer en toute sécurité aux deux et écouter le trafic entrant.


0 commentaires