См. Комментарии: Я исправлен. Я был миниинформирован. Тем не менее, я все еще думаю, что это чокнутый - полагаться на такие внутренние органы. Последний компилятор Microsoft, который я использовал, нарушал стандарты C99, и мне не было конца печали. Если они не могут получить возвращаемые значения прямо в vsnprinf () или new, Вы действительно хотите полагаться на подобные ошибки?
Вы делаете предположения относительно того, как реализован вектор. Вы предполагаете, что v [1] появляется сразу после v [0] в памяти.
Существует разница между char buf []; & buf [1] == & buf [0] + 1 и vector v; & v [1] == & v [0] + 1 . Массив char использует арифметику указателей. Вектор использует оператор []. То, как вектор хранит данные внутри, независимо от того, являются ли они смежными или нет, зависит от этого класса векторов.
Хотя ваш код все еще может работать, это все-таки вещь ПЛОХАЯ ! Это делает ваше программное обеспечение ломким, заставляя его ломаться странными и ожидаемыми способами, когда вы меньше всего этого ожидаете!
Это идеальная ситуация для временного массива char в локальном стеке. Размер маленький. У вас жестко задан максимальный размер.
Если бы размер не был постоянным, я бы по-прежнему использовал небольшой локальный буфер массива символов в стеке. Я бы просто добавил его в C ++ std :: string после каждой итерации. (Да, std :: strings может хранить двоичные значения, включая несколько нулевых символов.)
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;