Stucts unserialisiert über TCP-Socket schicken
-
Hi,
ich habe gehört man kann Structs mit send() über TCP schicken ohne sie serialisieren zu müssen. Kann mir das einer bestätigen? Und wenn ja, wie geht das?
Das zurückwandeln des als Char-Array empfangenen Strings geht wohl mit einer einfachen Typenumwandlung, aber wie geht funktioniert das Senden?Wäre sehr dankbar für auch nur Ansätze...
Greets,
Luke
edit (PS):
Kann ich denn auch ein Array von einem Struct verschicken? Und kann dieses Struct char-arrays von unterschiedlicher Länge enthalten?
-
Du kannst beliebige bytes (d.h. chars) schicken... also kannst du natürlich _alles_ schicken.
-
Ah-so! also einfach send(socket, myStruckt, sizeof(myStruct), 0); !?
Jetzt was schwieriger: Gibt es _irgendeine_ Möglichkeit ein Struckt-array mit nachträglich alloziierten Strings zu schicken?
Also
typedef struct { char * name; int num_albums; char ** albums; } artist_entry; artist_entry * artist_list; artist_list = (artist_entry *)malloc(num_artists*sizeof(artist_entry)); for(i=0; i<num_artists; i++) { [...] artist_list[ i ].name = (char*)malloc(artist_name_lenght); [...] } send(???);
..irgendeine?
-
wie gesagt, einfach schicken... dass du keine Zeiger verschicken sollst, sondern das worauf sie zeigen, sollte klar sein.
Wenn du keine feste Anzahl an Bytes verschickt, musst du dir natürlich irgendwas ausdenken, woran der Empfänger weiß, wieviel er empfangen soll. Könntest z.B. die Anzahl selbst vorweg schicken oder dir eine Endmarkierung ausdenken.
-
DrGreenthumb schrieb:
wie gesagt, einfach schicken... dass du keine Zeiger verschicken sollst, sondern das worauf sie zeigen, sollte klar sein.
Aber wenn ich das array so wie oben geschrieben schicke, schickt er doch die Zeiger, nicht deren Inhalt. Wie kann ich denn letzteres machen?
-
Luke-2 schrieb:
Aber wenn ich das array so wie oben geschrieben schicke, schickt er doch die Zeiger, nicht deren Inhalt. Wie kann ich denn letzteres machen?
den Inhalt auch mit send() verschicken.
-
Gib mal n Anstoß, wie stellste dir das vor? Einfach anhängen und ne liste von offsets mitschicken, danach irgendwie die adressenrausfinden und mit den Pointern verknüpfen?
-
Ich würde erst das struct selber (wenn es auch nicht-Zeiger enthält) schicken und anschließend stückweise die Blöcke, die es verzeigert hat - der Empfänger packt diese Zusatzdaten bei sich auf den Heap und aktualisiert dann die Zeiger-Elemente in seinem struct.
Als Beispiel:
typedef struct { int len; char* data; } string;//ich stelle sicher, daß len immer die größe des von data angeforderten Speicherblocks enthält //senden: string text; ... send(socket,&text,sizeof(string),0); //interne Daten verschicken send(socket,text.data,text.len,0); //Zusatzdaten verschicken //empfangen string text; recv(socket,&text,sizeof(string),0); //interne Daten empfangen //daß text.data auf Müll zeigt, stört erstmal nicht - das ändern wir sofort text.data=malloc(text.len); recv(socket,text.data,text.len,0); //Zusatzdaten empfangen
-
Anders gesagt, man muss es doch serialisieren. Ist auch irgendwie logisch ...