Je suis assez novice avec C et l'écriture d'un serveur TCP, et je me demandais comment gérer les recv() d'un client qui enverrait des commandes auxquelles le serveur répondrait. Par souci de cette question, disons simplement que l'en-tête est le premier octet, l'identifiant de la commande est le deuxième octet, et la longueur de la charge utile est le troisième octet, suivi de la charge utile (le cas échéant).Gestion de plusieurs appels recv() et de tous les scénarios possibles
Quelle est la meilleure façon de recv() ces données? Je pensais appeler recv() pour lire les 3 premiers octets dans le tampon, vérifier que les identifiants d'en-tête et de commande sont valides, puis vérifier la longueur de la charge utile et appeler à nouveau recv() avec la longueur de charge utile arrière du tampon susmentionné. Cependant, il conseille d'utiliser "un tableau assez grand pour deux paquets [longueur max]" pour gérer des situations telles que l'obtention du paquet suivant.
Quelle est la meilleure façon de gérer ces types de recv()? Question fondamentale, mais je voudrais l'implémenter efficacement, en gérant tous les cas qui peuvent survenir. Merci d'avance.
+1 pour les lectures courtes! J'ajouterais + s mais je ne suis pas autorisé.Les données ont peut-être été réparties sur une limite de paquet et ne sont pas encore arrivées. Ou le programme peut avoir reçu un signal. –
caf, merci! Le code aide toujours beaucoup. L'explication de Beej, ainsi que celle d'Alastair, est beaucoup plus logique maintenant. Je suis sûr que cela aidera aussi les autres joueurs. Je vais mettre en œuvre quelque chose de très similaire à cela pour mes recv. Une question cependant, sur la ligne: result = recv (chaussette, recv_buffer + recv_len, BUF_SIZE - recv_len, 0); vous n'êtes pas en boucle correcte? Donc par exemple, si BUF_SIZE est 1024, vous essayez de faire un recv de 1024 octets et de traiter tout ce qui vient dans le tampon, même si c'est un octet? Aussi, quel est le hit de performance de memmove sur le buffer si j'ai beaucoup de commandes à traiter? – Jack
@Jack: Droite - la boucle se produit autour de tout ce 'recv(); process_buffer(); 'segment (probablement avec un' select() 'dedans pour bloquer). 'process_buffer();' est appelé même dans le cas où il n'y a qu'un seul octet, parce que je pense qu'il vaut mieux garder tout le smarts pour "est-ce un message complet" dans un seul endroit (dans ce cas, 'process_buffer()' tomberait tout de suite, et vous finiriez dans 'select()', en attendant plus d'octets). – caf