Struktur über den Socket
-
in einer struktur kann man aber auch keinen string verwenden, du solltest also über eine dynamisch "struktur" nachednken, also was weis ich ... int für befehlsty und char für die länge des folgenden text und anschliessend den text direkt senden... im empfang machste dann erstmal
MyIntCharStruct Head; char buff[MAX_LEN]; // MAX_LEN sollte die maximale größe sein für die // zeichenlänge (TextLen hab ichs genannt) die du in deiner struktur angibst while( recv(So, Head, sizeof(Head), MSG_PEEK) != sizeof(Head)); // um sicherzugehen das ausreichend daten für den kopf da sind recv(So, Head, sizeof(Head), NULL); // Kopf einlesen while( recv(So, buff, Head.TextLen, MSG_PEEK) != Head.TextLen); // wiederum sichergehen das ausreichend daten vorhanden sind recv(So, buff, Head.TextLen, NULL); // fertig ... naja die fehlerkontrolle auf recv = 0 // und recv = SOCKET_ERROR musste dir schon selber überlegen :p
-
wie wärs damit
struct Message { char *_message; int messagelen; int messageType; };pseudo_:
int len = sizeof(int) + sizeof(int) + messagelen; memcpy( buf, &Message_t, len ); send( buf, len )
-
__intel schrieb:
ich werde sehr dankbar, wenn jemand eine Antwort hat )
Wir werden dankbar, wenn du erstmal eine Frage formulierst

Wenn du wissen willst, warum keine Message ausgegeben wird, dann siehe obige Posts. Wenn du was anderes wissen willst, dann frag nach, aber ohne Fragen gibts meist keine vernuenftigen Antworten...
-
@Ceos: MSG_PEEK sollte man nicht verwenden.
http://tangentsoft.net/wskfaq/newbie.html#peeking
http://support.microsoft.com/?scid=kb%3Ben-us%3B140263&x=8&y=12
-
hm ... gut zu wissen .... deswegen verwende ich winsock 2 ... tut mir leid das ich da von mirauf andere geschlossen habe, allerdings ist es datentechnisch genauso aufwendig erstmal alles dynamisch zwischenspeichern zu müssen .... ok bei dem hier ist es wenbiger ein problem, da legt man den peicher an, schreibt rein was man hat, mit maxlen = dem was man erwartet und anschliessend fürden fall das mal nicht alles da iss reduzierrt man einfach den zu erwartenden wert und schreibt dann einfach ab der position weiter wo man aufgehört hat .... ich hab ein etwas verzwickteres problem, weswegen ich nur schwer darauf verzichten kann .... by the way gilt das problem denn weiterhin auch für winsock 2 ?? kann mich zumindest bisher nicht über derartige vorfälle beklagen
-
Mach aus dem char* ein Char-Array mit fest definierter Länge und dann haust du das ganze Zeug mit reinterpret typecast-dingsda raus
Sollte klappen, knallt allerdings gewaltig wenn nicht das ankommt, was man erwartet 
-
da er es einfach hält und nur n einfachen chat macht sollte es so gehen ansonsten kannst ja mal die 2 ansätze von mir und sovok ansehen unter
http://www.c-plusplus.net/forum/viewtopic-var-t-is-192748.html
-
Normalerweise kann er die Struktur doch auch serialisieren und
anschließend verschicken, oder? Ist das nicht ein Anwendungsgebiet
von Serialisierung?
-
jo, und die vorgestellten lösungen machen nichts weiter, als die struktur zu serialisieren. wenn man es "schöner" machen will, schreibt man sich ne methode, die das objekt in nen string umbastelt, schickts dann durch die generische socket schicht, die nur mit simplen strings arbeitet und verwendet beim empfänger ne deserialize methode, die aus dem string wieder die entsprechende struktur bastelt.
die lösung hier ist halt direkt auf das problem zugeschnitzt.
-
um jetzt nochmal auf serialisierung zurück zu kommen:
ob ich nu nen Speicher-Dump- oder eine XML-Variante
verwende, es alles serialisierung richtig?!
-
jo. serialisierung bedeutet nichts weiter, als ein high level objekt flachzuklopfen. ob man aus dem ding nu nen string macht oder alle anteile in ein "high level" xml dokument klopft (SOAP sieht sowas u.u. vor), bleibt geschmackssache.
-
Ja, Serialisierung ist ein sehr allgemeines Konzept - das umfasst alle Möglichkeiten, dein Objekt in eine sequentielle Form zu quetschen.
(wichtig für die Anwendung ist nur, daß die Gegenseite weiß, nach welchem Prinzip serialisiert wurde)
-
Danke für die Info!