Voor mijn eerste kennismaking met networking onder C++ ben ik bezig van het maken van een (extreem simpele) Packet klasse, die zichzelf kan serializen en unserializen voor verzending over een netwerk stream.
Je zou verwachten dat hier pagina's vol over geschreven zijn op GoT en de rest van het internet, maar ik kan toch nergens echt een concreet antwoord vinden op mijn vragen
Afgezien van [rml][ C++/Linux] Networking, hoe structs verzenden?[/rml] heb ik hier op GoT niet echt concrete topics over network serialization gevonden
Ik zal eens beginnen met een relevant stukje uit het prototype van m'n Packet klasse:
Nu is de netPack methode, die verantwoordelijk is voor het serializen van de data members, op het moment heel erg simpel:
En het probleem zal duidelijk zijn: Hoe weet ik dat sizeof(int) aan de andere kant, waar dus ge-unserialized zal worden, gelijk is aan sizeof(int) op het lokale systeem?
Ik weet niet of er een naam is voor dit probleem, maar pointers richting de juiste documentatie zijn op dit moment erg welkom, want heb zelf geen flauw idee waar ik moet beginnen. Natuurlijk zijn hints over brakke constructies in mijn code ook van harte welkom
Tot slot vraag ik me af of ik op dit niveau al rekening moet houden met byte-ordering. Moet ik de byte-representaties van de integers bijvoorbeeld eerst omzetten naar netwok byte order voor ik ze aanelkaar plak?
Je zou verwachten dat hier pagina's vol over geschreven zijn op GoT en de rest van het internet, maar ik kan toch nergens echt een concreet antwoord vinden op mijn vragen
Afgezien van [rml][ C++/Linux] Networking, hoe structs verzenden?[/rml] heb ik hier op GoT niet echt concrete topics over network serialization gevonden
Ik zal eens beginnen met een relevant stukje uit het prototype van m'n Packet klasse:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
| class Packet { private: int id; int source; int destination; string data; public: Packet(int id, int source, int destination, string s); Packet(char* cbuf); // <snip> void netPack(char*); void netUnpack(char*); |
Nu is de netPack methode, die verantwoordelijk is voor het serializen van de data members, op het moment heel erg simpel:
C++:
1
2
3
4
5
6
7
| void Packet::netPack(char* cbuf) { int size = this->getSize(); char buf[size+1]; // reserve extra space for null char *bidx = buf; // index pointer char *lid = reinterpret_cast <char*> (&id); memcpy(bidx, lid, sizeof(this->id)); |
En het probleem zal duidelijk zijn: Hoe weet ik dat sizeof(int) aan de andere kant, waar dus ge-unserialized zal worden, gelijk is aan sizeof(int) op het lokale systeem?
Ik weet niet of er een naam is voor dit probleem, maar pointers richting de juiste documentatie zijn op dit moment erg welkom, want heb zelf geen flauw idee waar ik moet beginnen. Natuurlijk zijn hints over brakke constructies in mijn code ook van harte welkom
Tot slot vraag ik me af of ik op dit niveau al rekening moet houden met byte-ordering. Moet ik de byte-representaties van de integers bijvoorbeeld eerst omzetten naar netwok byte order voor ik ze aanelkaar plak?
micheljansen.org
Fulltime Verslaafde Commandline Fetisjist ©