2014-04-04 15 views
5

Ich bin auf der Suche nach einer Möglichkeit, ein Paket aus einer benutzerdefinierten Datenstruktur über einen Socket mit Boost Asio zu senden. Im Moment verstehe ich, dass Sie eine Zeichenfolge mit dem Standard-Boost-Asio-Puffer (in der Methode boost :: asio :: write (..)) senden können.Packing struct in Boost Asio Puffer

Ist es beispielsweise möglich, die Daten von einer ausgefüllten Struktur an den Server oder an einen Client zu senden? Wenn ja, wie muss ich das tun, weil ich keine Dokumentation darüber finden kann.

+0

@AndrewBarber lol @ schließen diese Frage - ich bin nicht einverstanden voll zu breit es ist per se (es ist getaggt [tag: boost-Asio] nach allem, und erwähnt er weiß, wie _boost Asio verwenden ' Puffer'_). Meine Antwort verweist auf die Teile der Dokumentation, die er nicht finden konnte. Aber ich sehe was du vermisst - Kontext und Beispielcode :) – sehe

+0

@sehe Hmmm ... klar, das sehe ich. Wiedereröffnung! –

Antwort

5

Sie können POD-Objekte nur bitweise kopieren.

Tatsächlich akzeptiert Asio boost/std array<T, N>, T[] oder vector<T> Puffer, solange T eine POD-Struktur ist.

Andernfalls können Sie Boost Serialization verwenden, um Ihre Daten zu serialisieren.

Schließlich gibt es einige Unterstützung für Binärdateien (binäre Dwords (Big-Endian/Little-Endian), binäre Schwimmer) in Boost Spirit.

aktualisieren Beispiel:

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

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

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

es Siehe Live On Coliru

+0

So könnte ich zum Beispiel eine neu erstellte Struktur als Puffer verwenden? Wenn ich folgendes habe: 'struct { float pos; Schwimmer pos2; } ' – Dries

+0

So ist es möglich, direkt zu sagen: n Bytes von Zeiger p? Oder ist diese Kopie obligatorisch? – Deduplicator

+0

Es gibt keine Kopie, wenn Sie 'boost :: asio :: buffer (...)' verwenden. ** EDIT ** hinzugefügt ein Beispiel live auf Coliru – sehe

0

hier bei der Konfiguration ist ein Beispiel, das für m funktioniert 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); 
}