Ver comentarios: Me erraron corregido. Estaba mininformado. Sin embargo, todavía creo que es una locura confiar en elementos internos como este. El último compilador de Microsoft que utilicé violó los estándares C99 y me causó un gran dolor. Si no pueden obtener los valores de retorno correctos en vsnprinf() o nuevo, ¿realmente desea confiar en la errata de esta manera?
Usted está haciendo suposiciones con respecto a cómo se implementa el vector. Está asumiendo que v [1] viene justo después de v [0] en la memoria.
Hay una diferencia entre char buf []; & buf [1] == & buf [0] + 1 y vector v; & v [1] == & v [0] + 1. La matriz de caracteres utiliza la aritmética del puntero. El vector usa el operador []. Cómo el vector almacena los datos internamente, si es adyacente o no, depende de esa clase de vector.
Mientras que su código aún puede funcionar, esta sigue siendo una cosa
BAD! Hace que su software se vuelva frágil, causando que se rompa de manera extraña y esperada cuando menos lo espera.
Esta es una situación ideal para una matriz de caracteres temporal en la pila local. El tamaño es pequeño Usted tiene un tamaño máximo codificado.
Si el tamaño no fuera constante, igual usaría un pequeño búfer local de matriz de caracteres en la pila. Solo lo agregaría a C++ std :: string después de cada iteración. (Sí, std :: cadenas pueden almacenar valores binarios incluyendo múltiples caracteres nulos.)
recv() devuelve la cantidad de bytes que leyó. Vector v no lo recoge automágicamente. Entonces necesita almacenar y usar ese valor.
sugiero:
#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;
Este código está roto. Horriblemente así. Usar un vector para asignar una matriz (que es lo que esencialmente está sucediendo allí) no solo es peligroso (¡los vectores son SIGNIFICADOS para reasignar sus matrices internas!) Sino también inútiles. –
Al menos use v.resize (1024 * 16) si * debe * usar un vector, pero como lo mencionó dionadar, hacerlo de esta forma no es una buena idea y, básicamente, no lo protege de nada y puede llevar a algunas noches interesantes depurando este código. –
¿Qué hay de malo con su uso del vector? si el tamaño es dinámico, no veo nada malo con él –