2017-03-13 10 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()); 

私が手出力は次のようになります。

26回:

received answer with numread: 1023 

とその後:

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

出力があることを確認し全体のファイルはtですただし、C++の文字列は、コンテンツを大きくする必要があるときに自動的にそのメモリを再割り当てする必要があります。それでなぜこれが起こっているのですか?

ありがとうございました。

+1

ちょうどデバッグ 'fprintfのを入れてください(stderrに、 "送信は全体の長さを超えている:%dは\ nを"、outStr.length());' '文字列'がどのように成長するかを見るために 'outStr + = buf;の直後に...あなたはおそらく完全に予期しない何かを見るでしょう。 – Ped7g

答えて

2

str::append(オーバーロード番号4)を使用して、追加するバイト数を明示的に指定できます。これにより、適切にnullバイトも追加されます。だから、代わりに:

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文字で正常に動作します。 –

関連する問題