2017-04-01 97 views
0

這是我的代碼..結果不同;的recv(襪子,BUF,的sizeof(BUF),0)和strlen的(BUF)中的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)); 
    . 
    . 
    . 
} 

上述結果...的

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

值recvsize is alaways 2525 而且我預計buf的strlen值當然會等於recvsize。但是,bufsize有時候等於2525,但有時它不一樣。 我錯過了什麼?

+3

你知道[std :: strlen](http://en.cppreference.com/w/cpp/string/byte/strlen)是否計數到它找到的第一個''\ 0'? – Galik

+0

@Galik說的是'recvsize'是套接字上接收到的字節數。然而,一個字符串是一個字符數組,而當傳遞給'strlen()'時,字節數組現在假設字符串語義而不是字節數組語義。因此,'strlen()'返回從起始點到找到字符串結尾或零值時發現的字符數。要確定這是否確實發生了什麼,可以檢查'strlen()'返回的長度之後的字符是否爲零。 –

回答

1

這意味着接收到的數據中有一個空字節(這意味着您可能不應該將其視爲文本數據開始,它顯然是二進制數據)。 recv()收到2525字節,但位於索引126的字節是0x00strlen()停止計數,在第一個'\0' char遇到。

您也有潛在的緩衝區溢出。如果recv()恰好收到sizeof(buf)字節數,則表示正在向數組的邊界外寫入NULL終止符。您需要改爲請求sizeof(buf)-1字節。否則,根本不要將NULL終止符插入到buf中。不要將它視爲空終止的文本,因爲它在技術上是任意數據,並且使用recv()返回的值來知道有多少個字節實際上保留。

相關問題