コメントを参照してください 。私は知らされていませんでした。しかし、このように内部構造に依存するのは、やはり馬鹿げていると思います。私が最後に使用した Microsoft コンパイラは C99 標準に違反していたので、悲しみは尽きませんでした。vsnprinf()やnew で正しい戻り値を取得できない場合、本当にこのようなエラータに頼りたいですか?
ベクトルの実装方法に関する仮定を立てています。v[1] がメモリ内の v[0] の直後に来ると想定しています。
char buf[];には違いがあります。& buf[1] == & buf[0] + 1 および ベクトル v; & v[1] == & v[0] + 1 . char 配列はポインター演算を使用します。ベクトルは operator[] を使用します。ベクターがデータを内部に格納する方法は、隣接しているかどうかに関係なく、そのベクター クラスによって異なります。
あなたのコードはまだ動くかもしれませんが、これはまだ悪いことです! それはあなたのソフトウェアをもろくし、予期せぬときに奇妙で予期された方法でソフトウェアを壊してしまいます!
これは、ローカル スタック上の一時的な char 配列にとって理想的な状況です。サイズは小さいです。ハードコーディングされた最大サイズがあります。
サイズが一定でない場合でも、スタック上の小さなローカル文字配列バッファーを使用します。各反復の後、C++ std::string に追加するだけです。(はい、std::strings は複数の null 文字を含むバイナリ値を格納できます。)
recv()は、読み取ったバイト数を返します。ベクトルvは、これを自動的に取得しません。したがって、その値を保存して使用する必要があります。
私は提案します:
#define BUFFER_SIZE (1024*16)
#define FLAGS 0
int received = 0;
int total = 0;
char buffer [ BUFFER_SIZE + 1 ];
memset( buffer, 0, BUFFER_SIZE + 1 );
received = recv( sockfd, buffer, BUFFER_SIZE, FLAGS );
if ( received > 0 )
{
copy( buffer + total,
buffer + total + received,
ostream_iterator<char>(cout) );
total += received;
}
while( (received > 0) && (total < BUFFER_SIZE) )
{
received = recv( sockfd, buffer + total, BUFFER_SIZE - total, FLAGS );
if ( received > 0 )
{
copy( buffer + total,
buffer + total + received,
ostream_iterator<char>(cout) );
total += received;
}
}
buffer [ total ] = '\0';
buffer [ BUFFER_SIZE ] = '\0';
cout << "The total size is " << total << endl;