Frage zu recv()



  • Hallo.

    Ich hab ein Problem und zwar habe ich eine Server Anwendung geschrieben die Daten mit recv() von einem Clienten empfängt.

    Und zwar so:
    rc=recv(connectedSocket,(char *)&buf2,sizeof(buf2),0);

    Nur leider weiss ich jetzt nicht wie ich die gespeicherten Daten auf dem Bildschirm ausgebe.

    Kann mir vielleicht jmd dabei helfen?

    Danke im Vorraus.

    Mfg



  • Console ? WinAPI ? MFC ? MessageBox ?

    mach so besser :

    long rc;
    char buffer[MAX_PATH];
    
    rc = recv(socket,buffer,sizeof(buffer),0);
    buf[rc]='\0';
    
    //.. dann kannst du zb
    
    MessageBox(0,buffer,"Received Buffer",MB_OK);
    
    //.. oder
    
    cout<<buffer;
    


  • Oh sorry, es geht um Konsole



  • cout<<buffer;
    
    // oder
    
    printf("Buffer: %s",buffer);
    


  • Danke.
    Jetzt ergibt sich eine neue Frage.
    Leert recv() den Buffer nach dem Aufruf automatisch, also kann ich den selben Buffer dann auf ein neues recv() anwenden?
    Wenn nicht wie leere ich ihn?



  • Der Buffer leert sich automatisch. Beachte das Sockets nach einem Warteschlangenprinzip arbeiten. Wenn du lags hast, bzw. Datenstau und die andere Seite mehrere Sends gemacht hat, wirst du alles nahtlos in einem Recv() empfangen, insofern du den Empfang bytetechnisch nicht genau angibst.

    Ich hatte da anfangs ziemliche Probleme mit. Im Prinzip musst du dir nur eine Klasse mit entsprechenden header schreiben. Dort sollte angegeben werden, wie viel Byte das aktuelle Packet groß ist, dann lässt sich alles prima parsen. 🙂



  • Ja das Problem is echt hart am Anfang 🙂

    wenn du machst

    long rc;
    char buffer[MAX_PATH];
    
    rc=recv(socket,buffer,sizeof(buffer),0);
    

    Wird der alte Wert von buffer natuerlich geloescht.
    Is wie

    char buffer[MAX_PATH];
    
    strcpy(buffer,"HI");
    strcpy(buffer,"Nochmal HI");
    

    buffer is jetzt "Nochmal HI"



  • Ich glaube er meint den Buffer vom Socket. Es gibt da ja auch einen Buffer wo die Daten liegen.
    Ich habe schonmal davon gehört dass man bei irgendeiner Programmiersprache den Socketbuffer per hand löschen muss. Wenn man recv() aufruft, rutschen ja automatisch die neuen daten nach, so das man bei einem erneuten aufruf von recv() die nächsten daten erhällt, da sie automatisch weitergeschoben werden.
    Würde das nicht der fall sein, hätte man immer die selben Daten beim aufruf von recv().



  • Bei recv aufpassen!!!

    Es müssen nicht immer alle Daten übertragen werden. Es kann sein das man mehrere Recv Aufrufe braucht um alle Daten zu empfangen die von einem send Aufruf kommen.

    Zur Ausgabe: Due bekommst einen ganz normalen Char Pointer von recv, denn musst du nur Nullterminieren und schon kannst du ihn an fast jede Winapi Funktion oder an Cout übergeben.



  • [cpp]
    
    std::string getLine() {
      std::string returnValue;
       while (1) {
         char r;
    
         recv(s_, &r, 1, 0);
         //hier kannst du noch einen switch über recv einbauen, um fehler festzustellen
    
         returnValue += r;
         //liest solange aus dem socket, bis ein zeilenumbruch erfolgt
         if (r == '\n')  return returnValue;
       }
    }
    [/cpp]
    

    Der String den zu rückbekommst kannst du mit cout einfach auf der konsole ausgeben. Der Vorteil hierbei ist, das keine buffer overflow beim auslesen aus dem socket bekommst.()



  • Oder man macht es so wie Daveron 🙂

    Aber ein switch macht zu Fehlerbehandlung IMHO nicht viel Sinn, da es nur den Fehler: recv(...) <= 0 gibt. Wenn ein Fehler auftritt musst mit WSAGetLastError() nach der Fehlerursache suchen.



  • Vielen dank für die zahlreichen Antworten ich werde es sofort ausprobieren. 🙂



  • [cpp]
    switch(recv(s_, &r, 1, 0)) {
           case 0: // nicht mehr verbunden;
             return "";
           case -1:
              if (errno == EAGAIN) {
                 return ret;
              } else {
                // nicht mehr verbunden;
               return "";
             }
         }
    [/cpp]
    

    Wie wäre es mit sowas 😉


Anmelden zum Antworten