私は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++の文字列は、コンテンツを大きくする必要があるときに自動的にそのメモリを再割り当てする必要があります。それでなぜこれが起こっているのですか?
ありがとうございました。
ちょうどデバッグ 'fprintfのを入れてください(stderrに、 "送信は全体の長さを超えている:%dは\ nを"、outStr.length());' '文字列'がどのように成長するかを見るために 'outStr + = buf;の直後に...あなたはおそらく完全に予期しない何かを見るでしょう。 – Ped7g