union per send() verschicken?
-
Und genau das ist das Problem. Manchmal schiebt der Compiler einfach mal in die struct ein paar padding bytes ein, so das es sein kann, dass du auf der anderen Seite eine etwas "andere" Variante deine struct wieder findest. Weiß nich, ob das bei Union auch so ist.. falls doch, müsstest du die Dinge eben einzeln schicken bzw. dir einen Serializer basteln, so würde man das zumindest bei einer struct machen.
Hoffe ich konnte helfen..
-
bei der union sollte es keine probleme geben, weil ja ein string[100] das größte element ist. also sollte, wenn die 100 bytes/chars geschickt werden, auch die union komplett und richtig rüberkommen. der int muss eh am anfang des strings seinen speicher haben.
-
achso ich habe vergessen zu sagen dass ich folgende fehlermeldung bekomme:
C:\Dokumente und Einstellungen\Finn\Desktop\c_chat\c_chat.cpp(184) : error C2664: 'send' : Konvertierung des Parameters 2 von 'union clientComm::uMsg' in 'const char *' nicht moeglich Kein benutzerdefinierter Konvertierungsoperator verfuegbar, der diese Konvertierung durchfuehren kann, oder der Operator kann nicht aufgerufen werden
-
bitte helft mir!
-
(char*)&uMessage
-
Morgen,
uMessage.iNr = 1; strcpy(uMessage.cMsg, "Hallo Welt");
dir ist klar, dass in iNr danach keine 1 mehr steht?
mfg
v R
-
nein oO
achso ist ne union etwa im grunde nue EINE variable, die verschiedene datentypen enthalten kann?hmm wenn das so ist,
kann man ne struct verschicken?
-
pixartist schrieb:
kann man ne struct verschicken?
Ja, genau so wie deine Union. Jeder flache Datentyp kann einfach verschickt werden.
-
cool
struct uMsg { int iNr; char cMsg[256]; }; char buf[256] = {0}; while(1) { scanf("%s",buf); printf("Eingabe:%s\n",buf); int nC = lookForCommand(buf); uMsg uMessage; switch(nC) { case 0: uMessage.iNr = 1; strcpy(uMessage.cMsg, buf); send (sock,(char*)&uMessage,sizeof(uMsg),0); break; case 1: return 0; break; case 2: uMessage.iNr = 2; strcpy(uMessage.cMsg, "Hallo Welt"); send (sock,(char*)&uMessage,sizeof(uMsg),0); break; default: break;
also hier verschick ichs dann als char, aber wie kann ichs dann wieder in ne struct umwandeln? danke
-
na beim empfangen einfach auf den speicheranfang einer entsprechenden struct leiten?
du musst nur aufpassen, dass du auch haargenau die gleiche zahl an bytes von der verbindung liest. schick am besten vorher eine längenangabe mit.
-
Jo, da sind wir dann wieder beim "Problem" Padding-Bytes angelangt.
-
c.rackwitz schrieb:
na beim empfangen einfach auf den speicheranfang einer entsprechenden struct leiten?
sry , aber wie mach ich das?
-
pixartist, mit ein bisschen pointern.
guck dir read() an, oder womit auch immer du daten empfängst.
mehr erklär ich nicht, sonst komm ich mir noch blöd vor.
-
hab msdn nach recv gesucht, nix gefunden
nu bitte sags dochmal
-
Na ich denke mal, gemeint ist, wenn du ein char* hast. Dann kannst du das auch als Struktur interpretieren, wenn du einen Zeiger drauf castest. So in etwa:
typedef struct { int a; int b; } TMyStruct; struct TMyStruct *pMyStruct; char *pStr; // Wenn du jetzt Daten in pStr hast, kann man die auch so interpretieren pMyStruct = (struct TMyStruct *)pStr;
Wenn die Daten vorher auch so in pStr geschrieben wurden, kannst du dann pMyStruct wieder als Struktur interpretieren.
(Ich hoffe, das ist jetzt irgendwie verständlich. :D)
-
ja, das ist verständlich, vielen dank!