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
Guybrush Threepwood Geschrieben 25. März 2003 Autor Geschrieben 25. März 2003 Ähm... und wie mach ich das?
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.
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?
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?
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.
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!
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
Stevie Geschrieben 25. März 2003 Geschrieben 25. März 2003 Suchst du Betatester für dein Programm? Ich bin dabei!
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
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????)
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.
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).
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.
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)
Empfohlene Beiträge
Erstelle ein Benutzerkonto oder melde Dich an, um zu kommentieren
Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können
Benutzerkonto erstellen
Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!
Neues Benutzerkonto erstellenAnmelden
Du hast bereits ein Benutzerkonto? Melde Dich hier an.
Jetzt anmelden