2017-04-01 1 views
0

Dies ist mein Code ..Die Ergebnisse sind unterschiedlich; recv (Socke, buf, sizeof (buf), 0) und strlen (buf) in C++

char buf[5000]; 
bool isHandshaking = false; 
bool isSingaling = false; 

while(1) 
{ 
    //-----------클라이언트로부터 수신------------ 

    int recvsize = recv(sock,buf,sizeof(buf),0); 
    printf("recvsize = %d\n",recvsize); 

    buf[recvsize] = '\0'; 
    printf("buf_len = %d\n",strlen(buf)); 
    . 
    . 
    . 
} 

Das obige Ergebnis ...

recvsize = 2525 
buf_len = 126 /*(or different value, sometimes 2525)*/ 

Wert von recvsize ist alaways 2525 Und ich erwartete, dass der strlen Wert von buf natürlich recvsize gleich wäre. Jedoch ist bufsize manchmal gleich 2525, aber manchmal ist es nicht das selbe. Was fehlt mir?

+3

Wussten Sie, dass [std :: strlen] (http://en.cppreference.com/w/cpp/string/byte/strlen) bis zum ersten "\" zählt? – Galik

+0

Was @Galik sagt ist, dass 'recvsize' die Anzahl der Bytes ist, die auf dem Socket empfangen werden. Ein String ist jedoch ein Array von Zeichen, und das Array von Bytes geht nun von einer String-Semantik und nicht von einer Byte-Array-Semantik aus, wenn es an 'strlen()' übergeben wird. So gibt 'strlen()' die Anzahl der Zeichen zurück, die vom Startpunkt bis zum Ende der Zeichenfolge oder dem Wert 0 gefunden wurden. Um festzustellen, ob dies tatsächlich der Fall ist, können Sie überprüfen, ob das Zeichen nach der von 'strlen()' zurückgegebenen Länge eine Null ist oder nicht. –

Antwort

1

Dies bedeutet, dass in den empfangenen Daten ein Null-Byte enthalten ist (was bedeutet, dass Sie es wahrscheinlich nicht als Textdaten behandeln sollten, sondern eindeutig binäre Daten). recv() empfing 2525 Bytes, aber das Byte, das sich bei Index 126 befand, war 0x00. strlen() stoppt beim ersten Zählen '\0' char es trifft.

Sie haben auch einen potenziellen Pufferüberlauf. Wenn recv() zufällig genau die sizeof(buf) Byteanzahl empfängt, schreiben Sie einen NULL-Terminator außerhalb der Grenzen Ihres Arrays. Sie müssten stattdessen sizeof(buf)-1 Bytes anfordern. Andernfalls fügen Sie keinen Nullabschluss in buf überhaupt ein. Behandeln Sie es nicht als nullterminierten Text, da es sich um technisch beliebige Daten handelt, und verwenden Sie den von recv() zurückgegebenen Wert, um zu wissen, wie viele Bytes buf tatsächlich enthält.

Verwandte Themen