nic_power Geschrieben 25. März 2003 Geschrieben 25. März 2003 Hallo, Probleme treten dann auf, wenn Du halbe Strings im Empfangspuffer hast, da diese nicht mit "0" terminiert werden. Ich würde eine eigene Empfangsroutine schreiben, die bei jedem Aufruf genau einen Null-Terminierten String zurückliefert und dabei auch Puffergrenzen mit beachtet. Nic Zitieren
Guybrush Threepwood Geschrieben 25. März 2003 Autor Geschrieben 25. März 2003 Ähm... und wie mach ich das? Zitieren
Klotzkopp Geschrieben 25. März 2003 Geschrieben 25. März 2003 Ich hatte mal so was ähnliches: currentmsg ist ein std::string, msgqueue ist ein std::queue<std::string>. Beide müssen außerhalb der Funktion deklariert sein (z.B. als Instanzvariablen einer Klasse). Die Parameter der Funktion sind der Puffer, den recv gefüllt hat, und die Anzahl der empfangenen Bytes. void ProcessData(char *buffer, int size) { for( int i=0; i<size; ++i ) { if( buffer[i] == '\0' ) { msgqueue.push( currentmsg ); currentmsg = ""; continue; } currentmsg += buffer[i]; } }[/CODE] Die Queue kannst du dann z.B. mit einem anderen Thread abarbeiten. Dann solltest du aber die Zugriffe auf die Queue synchronisieren. Zitieren
Guybrush Threepwood Geschrieben 25. März 2003 Autor Geschrieben 25. März 2003 was ist den pBuffer? Ist das nicht so etwas wie ich vorgeschlagen hatte? Zitieren
Guybrush Threepwood Geschrieben 25. März 2003 Autor Geschrieben 25. März 2003 Kann ich nicht irgendwie selber direkt von dem Socket lesen und nur die Daten von ihm entfernen die ich will? Zitieren
Klotzkopp Geschrieben 25. März 2003 Geschrieben 25. März 2003 Originally posted by Guybrush Threepwood was ist den pBuffer?Ein Schreibfehler. Hab's geändert. Ist das nicht so etwas wie ich vorgeschlagen hatte? Wenn es das ist, was du mit "Variable wechseln" meintest, ja. Aber die Funktion kann auch unvollständige Strings verarbeiten. Zitieren
Guybrush Threepwood Geschrieben 25. März 2003 Autor Geschrieben 25. März 2003 Ahhh, jetzt kapier ich die Funktion erst:) Ich probier mal sie einzubauen, danke! Zitieren
Guybrush Threepwood Geschrieben 25. März 2003 Autor Geschrieben 25. März 2003 So, jetzt scheint alles zu klappen:D Ich hab deine Funktion etwas abgeändert Klotzkopp, aber vom Prinzip her ist es die Selbe: void ProcessData(char *buffer, int size) { int nPos=0; nAnzahl=0; for( int i=0; i<size; ++i ) { if( buffer[i] == '\0' ) { lpCurrentMsg = (char*)realloc(lpCurrentMsg,_msize(lpCurrentMsg)+1); lpCurrentMsg[nPos] = '\0'; if (lpMessages == NULL) lpMessages = (char**)calloc(1,sizeof(char*)); else lpMessages = (char**) realloc(lpMessages,_msize(lpMessages) + sizeof(char*)); lpMessages[nAnzahl] = (char*) calloc(strlen(lpCurrentMsg)+1,sizeof(char)); strcpy(lpMessages[nAnzahl],lpCurrentMsg); free(lpCurrentMsg); lpCurrentMsg = NULL; nAnzahl++; nPos=0; continue; } if (lpCurrentMsg == NULL) lpCurrentMsg = (char*)calloc(1,sizeof(char)); else lpCurrentMsg = (char*)realloc(lpCurrentMsg,_msize(lpCurrentMsg)+1); lpCurrentMsg[nPos] = buffer[i]; nPos++; } } [/PHP] Ich hoffe es entstehen nicht zuviele Speicherlecks:rolleyes: Danke euch beiden, ihr habt mir sehr geholfen. Gruß Guybrush Zitieren
Stevie Geschrieben 25. März 2003 Geschrieben 25. März 2003 Suchst du Betatester für dein Programm? Ich bin dabei! Zitieren
Guybrush Threepwood Geschrieben 25. März 2003 Autor Geschrieben 25. März 2003 Originally posted by Stevie Suchst du Betatester für dein Programm? Ich bin dabei! Danke, aber da hab ich hier schon genug;) Gruß Guybrush Zitieren
Stevie Geschrieben 25. März 2003 Geschrieben 25. März 2003 Aber wenn's fertig ist, stellste's online und wir können's alle ausprobieren! (Ist dann doch wohl Freeware, oooder????) Zitieren
Guybrush Threepwood Geschrieben 25. März 2003 Autor Geschrieben 25. März 2003 Wenn du chatten willst dann kuck mal oben in die Leiste von Fachinformatiker.de direkt neben Forum. Zitieren
Stevie Geschrieben 25. März 2003 Geschrieben 25. März 2003 Originally posted by Guybrush Threepwood Wenn du chatten willst dann kuck mal oben in die Leiste von Fachinformatiker.de direkt neben Forum. :confused: Jaaa, neee, is schon klar!!! Ich hab nur vor einiger Zeit auch mal so ein Tool programmiert (allerdings in VB). Deshalb hätte mich deines interessiert. Außerdem würde ich es im internen Betrieb einsetzten (mit Kollegen). Zitieren
Guybrush Threepwood Geschrieben 25. März 2003 Autor Geschrieben 25. März 2003 Na dann, los. Selbst ist der Mann. und wenn du Probleme hast findest du hier kompettente Hilfe. Zitieren
Stevie Geschrieben 25. März 2003 Geschrieben 25. März 2003 Ich hab mein Tool ja schon lange fertig!!! Es funktioniert ein bißchen simpel aber es funktioniert. Mein Konzept: Jeder Benutzer kann als Server fungieren. Dazu erstellt er einfach auf einer Freigabe, die für alle verfügbar ist, eine Session. Die Nachrichten werde in einer Textdatei dort abgelegt und jeder angemeldete Benutzer holt sich die neuesten Nachrichten dort ab und markieren sie als von sich gelesen. Somit bekommen auch nachträglich angemeldete Benutzer den vorangegangenen Thread mit. Leider hab ich nur noch irgendwo das Tool aber nicht mehr den Quelltext. Aber ist ja auch egal, denn: "Visual Basic ist für Mädels. Echte Männer programmieren in C(++)." (Microsoft-Mitarbeiter auf der CeBit) Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.