2017-03-13 87 views
1

我在C++中有一個客戶端/服務器應用程序。服務器向客戶端發送一個相當大的文件(27KB)。客戶端從套接字中讀取1024字節的固定長度,然後將其連接到一個字符串。但是,當我使用+ =運算符時,它似乎沒有分配超過4048個字節,並且最終在客戶端有一個4KB文件。C++字符串不重新分配

客戶代碼:

#define BUFFER_SIZE 1024 
string outStr=""; 
char buf[BUFFER_SIZE]; 
while(1){ 
    int numread; 
    if ((numread = read(clientSocket, buf, sizeof(buf) -1)) == -1){ 
     fprintf(stderr,"Error: reading from socket"); 
     exit(1); 
    } 
    fprintf(stderr,"received answer with numread: %d\n",numread); 
    if (numread == 0){ 
     break; 
    } 
    buf[numread] = '\0'; 
    outStr+=buf; 
} 
fprintf(stderr,"Transmission is over with total length: %d\n",outStr.length()); 

輸出I得到的是:

26倍:

received answer with numread: 1023 

,之後:

received answer with numread: 246 
received answer with numread: 0 
transmission is over with total length: 4048 

輸出確認整個文件是t傳遞,但串聯不會讓我追加4048的(系統限制?)。但是,當內容需要更大時,C++字符串應自動重新分配其內存。那麼爲什麼會這樣呢?

謝謝你的回答。

+1

只要把調試'fprintf中(錯誤, 「傳輸完畢,總長度:%d \ n」,outStr.length());'在'outStr + = buf'後面,看看「字符串」是如何增長的......你可能會看到一些完全出乎意料的東西。 – Ped7g

回答

2

您可以使用str::append(第4號重載)並明確提供要追加的字節數。這將正確地附加空字節。因此,而不是:

buf[numread] = '\0'; 
outStr+=buf; 

outStr.append(numread, buf); 
0

字符串以'\ 0'結尾,所以如果來自套接字的字節數組具有類似的內容,那麼當您在響應字符串的末尾連接時,它只會連接到該點。所以我認爲你應該使用一個std :: vector來存儲整個響應。

+1

還有['std :: string :: assign()'](http://en.cppreference.com/w/cpp/string/basic_string/assign),這對於嵌入的NUL字符可以很好地工作。 –