Alle anliegenden Daten von Socket lesen.



  • Hallo C++-ler,

    Ich versuche alle Daten die an einem blockierenden Socket anleigen mithilfe der UNIX-Funktion-read zu lesen. Jedoch gelingt es mir nicht. Eventuell kann mir jemand sagen ob dies überhaupt mit blockierenden Sockets und wenn ja wie möglich ist alle anleigenden Daten zu lesen und diese in einen String zu speichern. Ich wäre für jede Hilfe dankbar.

    char *buf = new char[255];
    memset(buf, 0, 255);
    std::string recvData = "";
    int recvLength = 0;
    
    do {
    	recvLength = read(sock, buf, 255);
    	if(recvLength > 0) {
    		recvData += buf;
    		delete[] buf;
    	} else if(recvLength < 0) {
    		close();
    		throw "CONNECTION-ERROR";
    	} else if (recvLength == 0) {
    		close();
    	}
    } while(recvLength > 0);
    
    return recvData;
    

    Vielen Dank!

    Gruß EOF



  • Das Problem liegt in Zeile 10. Du kannst buf nicht einfach deleten und nachher wieder verwenden (erzeugt undefiniertes Verhalten). Warum erzeugst du den Buffer ueberhaupt mit new? Einfach

    char buff[255];
    

    und dann brauchst du dich nicht um die Speicherfreigabe zu kuemmern.



  • Vielen Dank für die schnelle Antwort.

    Nun sollte das use-after-free Problem auch behoben sein. Jedoch wird diese Funktion nun unendlich lange ausgeführt. Bis die Verbindung geschlossen wird oder ein Fehler auftritt.

    char buf[255]; 
    memset(buf, 0, 255); 
    std::string recvData = ""; 
    int recvLength = 0; 
    
    do { 
        recvLength = read(sock, buf, 255); 
        if(recvLength > 0) { 
            recvData += buf; 
        } else if(recvLength < 0) { 
            close(); 
            throw "CONNECTION-ERROR"; 
        } else if (recvLength == 0) { 
            close(); 
        } 
    } while(recvLength > 0); 
    
    return recvData;
    

    Gruß EFO



  • Du kannst mit man: select(2) prüfen, ob Daten zum Lesen anliegen. Wenn dies nicht der Fall ist, ließt du halt nicht weiter.



  • lagalopex schrieb:

    Du kannst mit man: select(2) prüfen, ob Daten zum Lesen anliegen. Wenn dies nicht der Fall ist, ließt du halt nicht weiter.

    Daran habe ich auch schon gedacht, jedoch blockiert select auch wenn sich im FD-SET nichts getan hat.

    Alternativ kann ich auch noch mir Libevent asyncron arbeiten. Jedoch wollte ich das vermeiden.

    http://www.wangafu.net/~nickm/libevent-book/01_intro.html

    Noch jemand eine andere Idee?

    Gruß EOF



  • EOF schrieb:

    Daran habe ich auch schon gedacht, jedoch blockiert select auch wenn sich im FD-SET nichts getan hat.

    Hast du timeout passend gesetzt?


Anmelden zum Antworten