Struct über Socket senden?
-
Jodocus schrieb:
> PODs (Plain Old Data) lassen sich über´s Netzwerk problemlos verschicken,
Das glaube ich nicht. Wie Dravere damals schon sagte, kann es da durchaus Probleme mit der Byte-Reihenfolge und dem Alignment bei unterschiedlichen Systemen geben. Besser, man benutzt ein kleines Anwendungsprotokoll (wie JSON).
Wenn man für mehrere Plattformen entwickelt gebe ich dir recht, aber die meisten Hobby-/Amateurprogrammierer tun das wohl nicht und daher bin ich auf diesen Punkt nicht eingegangen.
-
Ich wollte mich nochmals melden. Ist es möglich das Object als char* umzuwandeln und dies dann über einen Socket zu versenden oder entsteht dabei, dass von euch angesprochene Zeigerproblem mit string-Typen?
Ich brauch definitiv eine Lösung für die Versendung der Daten. Wie würdet ihr das Objekt(Programmcode s. oben) versenden?
Grüße
-
Das kommt ganz darauf an, was du unter "zu char* umzuwandeln" verstehst. Ein einfacher Cast reicht definitiv nicht aus, da hast du die bereits angesprochenen Probleme. Aber du kannst das Objekt in eine zusammenhängende Textdarstellung formatieren, die dann gesendet werden kann (die Gegenseite muß dieses Format dann kennen und parsen, um daraus wieder das Objekt zu rekonstruieren):
std::istringstream data; data<<map1.size()<<'\n'; for(auto it=map1.begin();it!=map1.end();++it) data<<it->first<<'\t'<<it->second<<'\n'; std::string text=data.str(); send(text.c_str());
-
Ich meinte auch mit "zu char* umzuwandeln" einen cast auf char*. Ich habe gehofft, dass ein einfacher Cast möglich ist aber Pusstekuchen.
ich werde versuchen das irgendwie doch noch auf die Beine zubekommen
Danke
-
ich hätte da noch eine Frage die ich gerne loswerden möchte.
was macht den bitte dieser Codeabschnitt:for(auto it=map1.begin();it!=map1.end();++it) data<<it->first<<'\t'<<it->second<<'\n';
bei mir wird ein Fehler ausgegeben. Vielleicht sollte ich erwähnen, dass ich mit Visual Studio 2008 programmiere bzw unter Windows.
-
Praktisch gesehen iteriert er über die map<> und packt alle Elemente in den Hilfsstream. Das "auto" könnte allerdings ein Problem sein für Compiler, die noch kein C++0x unterstützen - das mußt du im Zweifelsfall ersetzen durch "map<int,string>::iterator".
(PS: "bei mir wird ein Fehler ausgegeben" ist eine sehr präzise Beschreibung des Problems ;))
-
jepp es lag am "auto". Ich habe es gerade mit einem Iterator durchlaufen lassen und siehe da kein Fehler. Der Fehler war irgendwie eine halbe Seite lang und ich wollte hier kein Spam verursachen
puh der erste Schritt wurde durchgeführt nun folgt der Rest
wie kann ich jetzt aus dieser wieder ein map Eintrag machen?
bräuchte wieder einmap<int,string>
wahrscheinlich müsste ich die Nachricht in einer for-Schleife durchlaufen und die einzelnen Werte jeweils in die Map einfügen nehme ich mal schwer an
-
J.Wayne schrieb:
jepp es lag am "auto". Ich habe es gerade mit einem Iterator durchlaufen lassen und siehe da kein Fehler. Der Fehler war irgendwie eine halbe Seite lang und ich wollte hier kein Spam verursachen
puh der erste Schritt wurde durchgeführt nun folgt der Rest
wie kann ich jetzt aus dieser wieder ein map Eintrag machen?
bräuchte wieder einmap<int,string>
wahrscheinlich müsste ich die Nachricht in einer for-Schleife durchlaufen und die einzelnen Werte jeweils in die Map einfügen nehme ich mal schwer an
Edit: wie groß soll bei
rc=recv(connectedSocket,buf,sizeof(MapStruct),0);
als size angeben?
-
Wie ich schon oben gesagt habe: Beim Empfangen dieser Daten mußt du den String wieder parsen. Dazu hatte ich oben schon ein paar Trennzeichen eingefügt, an denen du dich orientieren kannst (ich würde wieder einen Stringstream verwenden und die Daten per >> und getline() rausholen - aber ich hab' keine Lust, dir jetzt alles vorzukauen).
PS: Was die Größe angeht: Hol dir alles was kommt (blockweise in einer Schleife, bis recv() -1 angibt) und lager es in einem String zwischen, der dann verarbeitet wird:
char buf[XYZ+1];//Größe ist afaik unwichtig, muß nur bekannt sein string recieved; int count; while((count = recieve(socket,buf,XYZ))>=0) { buf[count]='\0'; recieved+=buf; } ...
-
ich muss nochmals kurz stören. Es läuft alles wunderbar bis auf die Schleife für den Datenempfang. Das Programm ist in dieser Schleife und kommt nicht mehr heraus, ergo er ist in einer Enlosschleife gefangen.
Eine alternative fällt mir nicht ein. Habe einige Methoden versucht aber passt nicht. Ich könnte den array für size-Wert hoch wählen, aber dies wäre eine statische Lsg. Vielleicht fällt jemanden noch etwas ein.
-
Ändere >= in > 0
-
Ich hätte bezüglich String parsen eine Frage:
würde dieser Codeabschnitt eventuell Sinn machen
stringstream data; string key; while(data>>key) cout<<key.c_str();
Meine Frage ist aus Performansgründen oder programmiertechnisch für einen sauberen Code. Die meisten kennen sich besser aus als ich
@cooky451 wurde schon ausprobiert aber war erfolglos