J'écris un programme client-serveur simple. p>
Le client envoie des messages au serveur à l'aide de UDP ou de TCP. Le serveur doit pouvoir supporter à la fois UDP et TCP. P>
Si client, envoie un message à l'aide de UDP, la séquence d'appels de méthode dans le client est S'il utilise TCP,
La séquence d'appel dans le serveur est
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 (). P>
Alors, comment puis-je différencier / le savoir au début afin que je puisse apporter des appels de fonction appropriés. P>
Merci. P> Socket (), Linge (), SendTo (), RECVFROM (), Fermer () CODE> et que dans le serveur est < Code> Prise (), Bind (), SendTo (), RECVFROM (), Fermer () CODE>. P>
Socket (), Bind (), Listen (), Accepter (), Envoyer (), RECV (), Fermer () Code>.
et que dans le client est
Socket (), Bind (), Connect (), Envoyer (), RECV (), Fermer () Code> P>
4 Réponses :
Laissez simplement la prise TCP Écouter sur le port X et effectuez les connexions UDP via Port Y P>
Vous pouvez écouter en toute sécurité sur UDP et TCP sur le même port.
Avant que le paquet ne vous atteint, vous ne savez pas si c'est Vous voulez donc se lier aux deux 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. P> udp code> ou
tcp code>. p>
udp code> et
tcp code> si vous attendez des demandes des deux manières. P>
Lorsque vous créez la prise, vous passez un type - Les deux types de trafic seront sur deux prises différentes. p> sock_stream code> (TCP) ou
sock_dgram code> (UDP) p>
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.
Tout comme l'a souligné Henry Troup, une prise IP est définie comme p>
(transport, interface, port). P>
(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. P>
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 i> appeler
Bind () code> 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é () code> est généralement ce que vous voulez à la couche d'application. N'oubliez pas non plus que vous peut i> appelez
connect () code> sur une prise UDP. Cela ne fait pas de porte à la main, mais cela signifie que vous pouvez utiliser
envoi / recv code> au lieu de
SendTo / Recvrom code>, qui peut finir par rendre la logique client plus simple.