kann mir jemand diesen code erklären



  • char* RecvData(SOCKET s, unsigned bytes)
    {
        unsigned bytes_read = 0;
    	static char tempBuff[900000];
    	unsigned r;
        while ( bytes_read != bytes )
        {
            r = recv( s, tempBuff+bytes_read, bytes-bytes_read, 0 );
    
            // Grad keine Daten zum empfangen da?
            if ( r==-1 && WSAGetLastError()==WSAEWOULDBLOCK )
                Sleep( 20 );
            // Fehler bzw Verbindung geschlossen?
            else if ( r <= 0 )
    		{
    //Fehler 
    		}
    		else
                bytes_read += r;
        }
        return tempBuff;
    }
    

    Mit diesen Code kann man eine datei empfangen die in einem buffer ist.
    Habe den hier im Forum gefunden (eventuell Badestrand?)
    warum muss man hier mehr recv machen? Ich dachte eine Recv empfängt alles.
    und wie groß sollte ich temp buff setzten?



  • warum muss man hier mehr recv machen? Ich dachte eine Recv empfängt alles

    Tut es nicht. Es kann durchaus sein, dass nur einige Bytes empfangen werden und danach nochmals recv aufgerufen werden muss.

    Lies hier die Doku: http://msdn.microsoft.com/en-us/library/ms740121.aspx

    Simon



  • markus10k schrieb:

    Habe den hier im Forum gefunden (eventuell Badestrand?)

    Ich hatte ihn so ähnlich gepostet, allerdings ohne den static char-Buffer, den ich übrigens als schlechte Idee empfinde: Erstens ist die Funktion nicht re-entrant, zweitens könnte der Buffer nicht ausreichen und drittens wird evtl der Stack arg belastet.
    Deshalb die Funktion eher so gestalten:

    bool RecvDataBlocking(SOCKET s, unsigned bytes, char* buffer )
    {
        unsigned bytes_read = 0;
        while ( bytes_read != bytes )
        {
            int r = recv( s, buffer+bytes_read, bytes-bytes_read, 0 );
    
            // Grad keine Daten zum empfangen da?
            if ( r==-1 && WSAGetLastError()==WSAEWOULDBLOCK )
                Sleep( 20 );
            // Fehler bzw Verbindung geschlossen?
            else if ( r <= 0 )
                return false;
            else
                bytes_read += r;
        }
        return true;
    }
    


  • wieso wird der stack belastet lol



  • Wegen den 900 KB? Soweit ich weiß, werden die doch meistens auf dem Stack abgelegt? Oder wird da was in der Data-Section reserviert?



  • static
    


  • ebehard schrieb:

    static
    

    Ich weiß, dass der static Buffer static ist. Meine Frage war, wo er denn abgelegt wird.



  • auf jeden fall nicht im stack, sonst wär er nicht stattic.
    Mein tip wär im uninitialisierten Datensegment.



  • Ups, war nen bescheuerter Denkfehler mit dem Stack (würde ja allein auch wegen Multithreading nicht funktionieren). Na gut, dann wird's wohl das Datensegment sein, oder gibt's noch ähnliche Areas?


Anmelden zum Antworten