2011-05-08 18 views
6

che sto leggendo da un boost::asio::ip::udp::socket come questo:spinta dinamicamente dimensioni :: :: asio tampone

using boost::asio::ip::udp; 

// ... 

char recv_buf[128]; 
udp::endpoint sender_endpoint; 
size_t len = socket.receive_from(boost::asio::buffer(recv_buf), sender_endpoint); 

Ora, questo funziona perfettamente bene, ma l'importo massimo di caratteri che sono in grado di ricevere è ora 127. Tuttavia sto affrontando un problema perché devo accettare alcuni input di dati di cui la lunghezza può variare molto (e non è di lunghezza ben definita con intestazioni prefissate, per esempio). Una soluzione a questo sarebbe un buffer espandibile dinamicamente, come un vettore. È possibile creare un boost::asio::buffer dinamicamente in espansione per accettare (teorico) quantità infite di input e memorizzarlo in un contenitore?

risposta

5

La dimensione del datagramma UDP non varia molto: non sarà mai maggiore di 65535, lasciando spazio per 65.527 byte di dati dopo l'intestazione da 8 byte.

+1

+1 Hai completamente ragione! Sarei comunque interessato ad un dinamico 'boost :: asio :: buffer', non perché 64KiB sia così grande, ma un buffer dinamico sembra spesso molto più appropriato, e per il riutilizzo in TCP. – orlp

+0

@nightcracker con TCP, asio chiama il gestore di lettura quando il buffer è pieno, quindi è possibile svuotarlo e tornare alla lettura. – Cubbi

0

Non sembra esserci alcuna disposizione per il dimensionamento dinamico. E ha senso che non ci sarebbe. Pensate a cosa sarebbe dovuto accadere:

  • un singolo datagramma UDP possono essere ricevuti solo una volta, e allo stesso tempo, quindi:
  • il buffer dato alla chiamata di sistema a basso livello deve essere abbastanza grande per il il più grande messaggio valido, quindi
  • perché sia ​​efficiente, il buffer deve essere assegnato in anticipo dal chiamante.

Quindi non ha senso che ci sia un buffer di dimensioni dinamiche disponibile. Come sottolinea Cubbi, i datagrammi UDP hanno comunque una dimensione massima piccola, quindi basta fare il buffer grande quanto il più grande messaggio valido nel tuo sistema e farne uso.

+3

'boost :: asio :: buffer' è un buffer di input/output ASyncronus generico e non è utilizzato solo per UDP. – orlp

+0

Sicuro. E in generale non ha senso avere uno dinamico. Né per l'applicazione, né per il protocollo TCP né per qualsiasi altro protocollo che alla fine richiami le routine C di basso livello per svolgere il loro lavoro, perché causerà solo una copia inefficiente della memoria, che è un anatema in C++ e in Boost. –

1

Se si utilizzano buffer più piccoli, è possibile raggrupparli facilmente tramite i concetti * BufferSequences. Ad esempio, è possibile passare per accettare dati da una chiamata di lettura (2) o passare un ConstBufferSequence per un elenco di buffer che si sta per scrivere (2). Detto questo, tendo a raccomandare l'uso di un buffer singolo in ogni direzione perché tende a semplificare il codice (anche se non è sempre possibile).