Question

J'ai quelques questions simples, j'ai une application client-serveur et les données envoyées sur le fil.

Je voudrais être en mesure de récupérer les données et gérer correctement.

struct T1
{
   int id;
   int foo;
};

struct T2
{
  int id;
  char foo;
  int bar;
};

Prenons ces structures, ils sont envoyés sur le réseau précédé d'un int qui dira si l'une suit T1 ou T2. Si le client me envoie T1, puis me envoie T2, dois-je l'assurance que je peux lire une structure complète avec asio :: ip :: :: tcp socket.async_read ()? Je voudrais mettre en place un gestionnaire qui va traiter un seul struct, mais ce qui se passera si je suis incapable de lire tout en un seul async_read ()?

  

L'opération asynchrone volonté   continuer jusqu'à ce que l'un des éléments suivants   conditions est vrai:

     
      
  • Les tampons fournis sont pleins. Autrement dit, les octets transférés est égal à la somme des tailles de tampon.
  •   
  • Une erreur est survenue.
  •   

Sera-t-rejeter les données qui ne peuvent pas être lus? il va déclencher une autre async_read? Et, je suis certain que le async_read n'obtenir un ID + la structure si mon client me envoie successivement l'ID + la structure? Ou peut les choses OPTIMIZE OS et les mettre à la fois dans le même paquet? Comme vous avez pu le voir, je suis un peu confus, je voudrais prendre les bonnes décisions lors de la conception d'une application client / serveur, toute aide sera appréciée.

Merci.

Était-ce utile?

La solution

EDIT: Merci à @timo d'avoir signalé une erreur. async_read ne se terminera pas jusqu'à ce qu'un struct entier est lu, de sorte que vous n'avez pas besoin de boucle. Sinon, ma réponse est la même. Rien ne sera perdu, quelle que soit la façon dont les pauses de protocole TCP vers le haut ou coalesce les données.

S'il n'y a pas suffisamment de données dans les tampons TCP pour remplir votre tampon d'entrée, la lecture va simplement chercher ce qui est disponible, et indiquer le nombre d'octets alla chercher. Ce qui se passe ensuite dépend de vous. Vous pourriez avoir suffisamment de données dans les octets récupérés pour vous décidez de ne pas continuer, rend si asio aucune hypothèse. Si vous avez pas lu suffisamment d'octets pour comprendre une structure complète, puis lancer un async_read plus, en répétant le processus jusqu'à ce que vous avez assez d'octets ou meurt quelque chose.

Je ne sais pas ce que vous entendez par « incapable de lire tout. » deux significations possibles viennent à l'esprit:

  1. La quantité de données qui est disponible à lire ne remplit pas struct. Dans ce cas, il vous suffit faites une autre READ_ASYNC attendre plus de données pour arriver.
  2. La struct n'absorbe pas toutes les données qui est arrivé. La pile TCP simplement tamponner les données non lus jusqu'à ce que vous obtenez à le lire.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top