2014-04-04 16 views
5

Sto cercando un modo per inviare un pacchetto costituito da una struttura dati personalizzata attraverso un socket con Boost Asio. Al momento capisco che è possibile inviare una stringa con il buffer standard boost asio (nel metodo boost :: asio :: write (..)).Stringa di imballaggio nel buffer Boost Asio

È possibile, ad esempio, inviare i dati da una struttura compilata al server o ad un client? Se sì, come ho bisogno di farlo perché non riesco a trovare la documentazione su questo.

+0

@AndrewBarber lol @ chiudere questa domanda - io non pienamente d'accordo che sia troppo ampia per se (è etichettato [tag: spinta ASIO], dopo tutto, e cita lui sa come usare ASIO _boost ' buffer'_). La mia risposta si collega alle parti della documentazione che non è riuscito a trovare. Ma vedo cosa ti manca - contesto e codice di esempio :) – sehe

+0

@sehe Hmmm ... certo, lo vedo. Riapertura! –

risposta

5

È possibile copiare gli oggetti POD in modo bit per bit.

Infatti, Asio accetta buffer boost/std array<T, N>, T[] o vector<T> finché T è una struttura POD.

In caso contrario, è possibile utilizzare la Serializzazione boost per serializzare i dati.

Infine, c'è un supporto per i binari (dias binari (big-endian/little-endian), float binari) in Boost Spirit.

Aggiornamento Esempio:

#include <memory> 
#include <boost/asio.hpp> 

int main() 
{ 
    struct { float a, b; } arr[10]; 

    auto mutable_buffer = boost::asio::buffer(arr); 
} 

Guardalo Live On Coliru

+0

Quindi, ad esempio, potrei usare una struct appena creata come buffer? Se ho il seguente: 'struct { float pos; float pos2; } ' – Dries

+0

Quindi, è possibile dire direttamente: n byte dal puntatore p? O quella copia è obbligatoria? – Deduplicator

+0

Non c'è copia se si utilizza 'boost :: asio :: buffer (...)'. ** EDIT ** aggiunto un esempio dal vivo su coliru – sehe

0

qui è qualche esempio che funziona per m e:

void callback(STRUCT_A& s) 
{ 
    f_strand.post(boost::bind(f, boost::asio::buffer(&s, sizeof(s)))); 
} 

void f(boost::asio::mutable_buffers_1 v) 
{ 
    STRUCT_A *a = boost::asio_buffer_cast<STRUCT_A*>(v); 
}