Problem mit send/recv
-
Hallo,
ich hab ein etwas seltsames Problem mit send bzw recv.
Erstmal ein absoultes Minimalbeispiel, um dieses zu verdeutlichen:#include <string> #include <iostream> #include <winsock2.h> #include <cstring> using namespace std; int main(int argc, char *argv[]) { WSADATA wsaData; WSAStartup(MAKEWORD(2,2), &wsaData) != 0; SOCKET sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); SOCKADDR_IN saddr_in; saddr_in.sin_family = AF_INET; saddr_in.sin_addr.s_addr = inet_addr("80.190.241.136"); saddr_in.sin_port = htons(80); connect(sock, (SOCKADDR*)&saddr_in, sizeof(saddr_in)); char buffer[] = "GET Cpp/index.html HTTP/1.1\r\nHost: www.volkard.de\r\nAccept: */*\r\nConnection: close\r\n\r\n"; send(sock, buffer, strlen(buffer), 0); //string buffer = "GET Cpp/index.html HTTP/1.1\r\nHost: www.volkard.de\r\nAccept: */*\r\nConnection: close\r\n\r\n"; //send(sock, buffer.c_str(), buffer.size(), 0); int len = 256; char recvbuf[256]; int bytesReceived; while((bytesReceived = recv(sock, recvbuf, len, 0)) != 0) { cout << recvbuf; memset(recvbuf, 0, len); } closesocket(sock); WSACleanup(); return 0; }Wenn das Programm so ausgeführt wird, wie es oben steht, funktioniert alles wie gewünscht.
Wenn ich nun meinen buffer durch eine Variable vom typ std::string ersetze (siehe auskommentierte Zeilen), was ich im eigentlich Programm auch aus Komfort-Gründen getan habe, funktioniert das Senden auch noch. Aber beim Empfangen der Daten steht auf einmal an einigen (wenigen) Stellen "Müll" im Puffer (der immer noch ein char-Array ist). Beispielsweise stehen in der Zeile nach dem Header, der ja eigentlich eine Leerzeile sein sollte, plötzlich 4-5 wirre Buchstaben ("€ßH]" oder Ähnliches). Ich bekomme aber definitiv keinen Bad Request oder sowas zurück, sondern es ist die richtige Datei mit eben diesen Fehlern.
Weiss jemand, woran das liegen könnte, ist das ein Bug (benutze Dev-C++ mit Mingw/gcc 3.4.2)?
-
Weil du recvbuf nicht 0 terminierst.
-
Stimmt, das habe ich in dem Beispiel vergessen, aber daran liegt es leider nicht (habe es gerade noch mal probiert).
-
Dann zeig den neuen Code...

-
Ich habe es oben editiert (die while-Schleife).
Aber wie gesagt, wenn ich nur char-Arrays benutze funktioniert das Programm normal. Wenn der Puffer, der zum Senden benutzt wird, allerdings vom Typ string ist, tritt das Problem beim Empfangen auf - obwohl der Empfangsteil unverändert ist.
-

-
char recvbuf[256 + 1]; int bytesReceived; do { bytesReceived = recv(sock, recvbuf, 256, 0); recvbuf[bytesReceived] = '\0'; cout << recvbuf; } while(bytesReceived != 0);
-
Was beispiel damit sagen will: Wenn du 256 Zeichen in einen 256 Zeichen großen Puffer einliest, dann ist da kein Platz mehr für eine Nullterminierung.
-
Du machst ja memset erst nach der ersten Ausgabe.

-
Ja, danke Euch für die Hilfe!
Das war dumm
