Domanda

ho alcune domande semplici, Ho un'applicazione client-server e dati inviati sul filo.

Mi piacerebbe essere in grado di recuperare i dati e gestire in modo corretto.

struct T1
{
   int id;
   int foo;
};

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

Prendiamo queste strutture, vengono inviati sulla rete preceduto da un int che vi dirà se sia T1 o T2 segue. Se il cliente mi manda T1, poi mi manda T2, ho la certezza che posso leggere una struttura completa con ASIO :: ip :: tcp :: socket.async_read ()? Mi piacerebbe istituire un gestore che gestirà una sola struct, ma cosa accadrà se io sono in grado di leggere tutto in un unico async_read ()?

  

L'operazione asincrona   continuerà fino a quando una delle seguenti   condizioni:

     
      
  • I buffer in dotazione sono pieni. Cioè, la IS byte trasferiti pari alla somma delle dimensioni del buffer.
  •   errore
  • Si è verificato un.
  •   

Sarà scartare i dati che non possono essere letti? intende innescare un altro async_read? E, io sono assicurato che un async_read otterrà soltanto un ID + Struttura se il mio cliente mi manda in sequenza l'ID + Struttura? O possono le cose OS ottimizzare e loro sia messo nella stessa paquet? Come avrete visto, io sono un po 'confuso, mi piacerebbe prendere le decisioni giuste quando si progetta un'applicazione server / client, qualsiasi aiuto sarà apprezzato.

Grazie.

È stato utile?

Soluzione

EDIT: Grazie a @timo per indicare un errore. async_read non sarà completo fino a quando un intero struct viene letto, in modo che non c'è bisogno di loop. In caso contrario, la mia risposta è la stessa. Nulla sarà perso, indipendentemente da come le interruzioni del protocollo TCP su o fonde i dati.

Se non c'è abbastanza dati nei buffer TCP per riempire il vostro buffer di ingresso, la lettura sarà semplicemente prendere ciò che è disponibile, e riportare il numero di byte recuperati. Quello che succede dopo è a voi. Si potrebbe avere abbastanza dati nei byte recuperati per decidere che non vuoi continuare, fa in modo ASIO supposizioni. Se non avete letto abbastanza byte per comprendere una struttura completa, quindi avviare un ulteriore async_read, ripetendo il processo fino ad avere abbastanza byte o qualcosa muore.

Non sono sicuro di cosa si intende per "in grado di leggere tutto". due possibili significati vengono in mente:

  1. La quantità di dati che è disponibile da leggere non riempie una struct. In questo caso, è sufficiente fare un altro READ_ASYNC di aspettare più dati per arrivare.
  2. Lo struct non assorbe tutto ciò che i dati che sono arrivati. Lo stack TCP sarà semplicemente buffer di dati non letti fino ad arrivare intorno a leggerlo.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top