recv hängt wenn alles von einem socket empfangen wurde statt 0 zurückzugeben!?



  • Hi,
    also ich empfange mit folgender Funktion Daten über einen Socket(ich bin Server):

    string NetSocket::receive_message(void)    
    {
    string received;
    char buf[MAX_SIZE];
     do{
    
       rc = recv(s,buf,MAX_SIZE,0);
    
       if(rc==SOCKET_ERROR)
        {
         error_b = 1 ;
         error += "Recv failed!\n";
        }
        buf[rc]='\0';
        received += buf;
    
    }while(rc != 0 && rc != SOCKET_ERROR );    
    
    return received;    
    }
    

    Als Client benutze ich Firefox den ich so konfiguriert hab das er meinen Server
    als "Proxy" verwendet!
    rc ist,wenn die Anfrage von Firefox 522 Bytes ist auch 522,er macht also weiter
    mit der Schleife und trifft dann wieder auf recv!Und hier hängt er dann... Aber
    warum? Wenn alles ausgelesen ist sollte recv doch nicht hängen sondern einfach 0
    zurückgeben,oder?
    Der Server kommt erst dann aus der Schleife raus wenn der Client die Verbindung abbricht 😕

    Schon mal Danke für jede Hilfe!



  • Wenn Du Deinem Server sagst, dass er lesen soll und nicht via Events gehst, wartet eben der Server bis Daten kommen (oder die Verbindung beendet wird).
    Siehe WSAAsyncSelect
    oder diverse Beispiele auf Codeproject...



  • Ok Danke!
    Da ich es portabel halten möchte hab ich es jetzt so gelöst:
    Ich schaue am Ende der Schleife ob das der erste Schleifen durchlauf ist und ob die
    empfangenen Daten kleiner sind als MAX_SIZE,ist das der Fall wird gebrakt.
    Erklärung:
    Wird recv das erste mal aufgerufen ist der Rückgabewert gleich der größe des
    Buffers WENN noch Daten zum lesen verhanden sind (soweit ich weiß
    jedenfalls,andernfalls belehrt mich 😉 )ansonsten breakt er eben!



  • Vergesst was ich gesagt hab 😕
    Gibt es auch eine Portable Lösung ala

    if(readable(socket))
     [...];
    

    ?

    Danke im voraus



  • recv schrieb:

    Vergesst was ich gesagt hab 😕
    Gibt es auch eine Portable Lösung ala

    if(readable(socket))
     [...];
    

    ?

    Danke im voraus

    Jep, nennt sich select(). Schau mal hier:

    http://c-worker.ch/tuts/select.html

    mfg.



  • Ok Danke 🙂


Anmelden zum Antworten