2016-04-12 6 views
0

Ich habe eine Liste definiert als serialisiert:Wie eine Liste in ein Array von Zeichen

list<Message*> g_messages; 

wo Message ist:

struct Message { 

    static unsigned int s_last_id; 
    string user_name; 
    string content; 
    unsigned int id; 
}; 

Mein Ziel ist es, diese Informationen mit Winsock zu senden (vom Server Client), aber das erlaubt nur das Senden von Zeichen, wie es in WinSock2.h erscheint. Unter Berücksichtigung dieser Tatsache möchte ich alle Informationen (id, content und user_name) in einem Array von Zeichen serialisieren, um sie alle zusammen zu senden, und im Client eine Funktion zur Deserialisierung haben, um denselben Vektor I zu haben hatte im Server.

Wie könnte ich es implementieren?

Jede Hilfe wird geschätzt.

+0

Sie werden ein Protokoll erfinden müssen. Und bitte, um Himmels willen, speichern Sie keine Zeiger in std :: containern. Objekte speichern –

Antwort

1

Sie haben ein paar Optionen, es gibt keine einzige triviale Lösung dafür. Sie müssen Ihr eigenes Protokoll entwerfen, auf das sich der Server und der Client hinsichtlich der Serialisierung und Deserialisierung in und aus dem Socket-Stream einigen können.

Eine Eigenschaft Ihrer Message, die dies ein wenig schwierig macht, ist, dass, wenn sie zu einem Zeichenarray abgeflacht ist, es zu einem Array mit variabler Länge führt, da die Strings der Variable Message variable Länge haben. Daher wird auf der Clientseite ein gewisses Maß an Interpretation vorhanden sein, da nicht angenommen werden kann, dass Bytes 0-2 X entsprechen und so weiter.

Ein Ansatz Sie nehmen könnte, ist alle Ihre Datenelemente in einen String-Stream mit jedem Datenelement durch ein Trennzeichen, Leerzeichen vielleicht getrennt zu schreiben:

std::ostringstream oss; 
oss << s_last_id << " " << user_name << " " << content << " " << id; 

Und dann, wenn an der Buchse zu schreiben:

std::string messageString = oss.str(); 
std::vector<char> writable(begin(messageString), end(messageString)); 
char* c = &writable[0]; 

send(socket, c, writable.size(), 0); 

Auf der Clientseite können Sie die eingehende Zeichengruppe in die entsprechenden Datenelemente dann analysieren:

char recvBuf[bufMax]; 
recv(socket, recvBuf, bufMax, 0); 

std::istringstream iss(std::string(recv)); 
iss >> s_last_id >> user_name >> content >> id; 

Es ist vielleicht nicht die performanteste Lösung, aber es ist ziemlich einfach und kann für Ihren Fall gut funktionieren.

+0

'beginnen (oss.str()), Ende (oss.str())' Nein bueno. [Grund.] (Http://stackoverflow.com/questions/12267199/stringstream-to-vectorchar-throws-stdbad-alloc) – screwnut

+0

Guter Anruf, ich werde reparieren, wenn ich kann –

+0

Vielen Dank, wir werden diesen Code versuchen! – Miren

Verwandte Themen