Siehe Kommentare: Ich stehe korrigiert. Ich wurde informiert. Aber ich denke immer noch, es ist verrückt, sich auf solche Interna zu verlassen. Der letzte Microsoft Compiler, den ich verwendet habe, hat die C99-Standards verletzt, was mir kein Ende der Trauer beschert hat. Wenn sie keine Rückgabewerte direkt auf vsnprinf() oder neue erhalten können, wollen Sie wirklich auf Errata wie folgt verlassen?
Sie machen Annahmen hinsichtlich der Implementierung von Vektoren. Sie nehmen an, dass v [1] direkt nach v [0] im Speicher kommt.
Es gibt einen Unterschied zwischen char buf []; & buf [1] == & buf [0] + 1 und vektor v; & v [1] == & v [0] + 1. Das Char-Array verwendet Zeigerarithmetik. Der Vektor verwendet den Operator []. Wie der Vektor Daten intern speichert, ob er benachbart ist oder nicht, hängt von dieser Vektorklasse ab.
Während Ihr Code noch funktioniert, ist dies immer noch eine
BAD Sache! Es macht Ihre Software spröde, was dazu führt, dass sie auf seltsame und erwartete Weise bricht, wenn Sie es am wenigsten erwarten!
Dies ist eine ideale Situation für ein temporäres Char-Array auf dem lokalen Stack. Die Größe ist klein. Sie haben eine fest codierte maximale Größe.
Wenn die Größe nicht konstant war, würde ich immer noch einen kleinen lokalen Char-Array-Puffer auf dem Stapel verwenden. Ich würde es einfach nach jeder Iteration an eine C++ std :: string anhängen. (Ja, std :: strings kann Binärwerte einschließlich mehrerer Nullzeichen speichern.)
recv() gibt zurück, wie viele Bytes es gelesen hat. Vektor v nimmt das nicht automatisch auf. Sie müssen diesen Wert also speichern und verwenden.
Ich schlage vor:
#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;
Dieser Code ist beschädigt. Schrecklich so. Die Verwendung eines Vektors zur Zuweisung eines Arrays (was im Wesentlichen dort passiert) ist nicht nur gefährlich (Vektoren sind wichtig, um ihre internen Arrays neu zuzuordnen!), Sondern auch sinnlos. –
Verwenden Sie v.resize (1024 * 16), wenn Sie * einen Vektor verwenden müssen, aber wie von dionadar erwähnt, ist es keine gute Idee, dies zu tun und schützt Sie im Grunde nicht davor und könnte auch dazu führen einige interessante Nächte, die diesen Code debuggen. –
Was ist falsch an seiner Verwendung von Vektor? Wenn die Größe ist dynamisch, ich sehe nichts schlechtes mit ihm –