[Problem] Wie lese ich alles was der Server sendet aus,via recv / Probleme mit meinem Code
-
Hallo

Also ich schreibe gerade ein paar Netzwerk Funktionen,eine davon sollte die
gesammte Antwort des Servers (z.B. bei einem HTTP-GET den Source einer Seite)
in einen String schreiben und ihn dann zurückgeben,der Code:string receive_message(void) { string received; char buf[MAX_SIZE]; do{ rc = recv(s,buf,MAX_SIZE,0); if(rc==0) { error_b = 1 ; error += "Disconnected!\n"; } if(rc==SOCKET_ERROR) { error_b = 1 ; error += "Recv failed!\n"; } received += buf; cout << rc << endl; }while(error_b == 1 || rc >= MAX_SIZE); return received; }Dort lass ich mir rc ausgeben,er gibt einmal 1204 und dann 236 aus,wobei
die Schleife abbricht da MAX_SIZE 1024 ist!
Lass ich mir dann received ausgeben ist das aber bei weitem nicht der gesammte
Code der Seite...Warum empfange ich beim 2. Mal nur noch 236 Bytes?Normalerweise
sollte ich doch solange 1024 empfangen bis ich fast alles ausgelesen hab,dann
sollte ich weniger also 1024 auslesen,eben weil nichts mehr da ist,und dann erst
abbrechen...
Aber dem ist leider nicht so!
Was mich noch stutzig mach ist dascout << get.length();2050 ausgibt o.O

Wär echt schön wenn mir jemand sagen kann was es damit auf sich hat und wie ich
alles auslesen kann
Danke im voraus
Hier nochmal der gesammte Code:
#define _WIN32_WINNT 0x0500 #include <string> #include <iostream> #include <windows.h> #include <winsock2.h> #define MAX_SIZE 1024 using namespace std; int startWinsock(void); long getAddrFromString(char* ,SOCKADDR_IN* ); void send_message(char* ); string receive_message(void); void start(char*,int); string error; int error_b; long rc; SOCKET s; SOCKADDR_IN addr; char buf[256]; string get; int main(void) { cout << "Starting Winsock..."; startWinsock(); cout << "Done\n\n"; cout << "Connecting..."; start("google.de",80); cout << "Done\n\n"; cout << "Sending..."; send_message("GET / HTTP/1.1\nHost: www.google.de\n\n"); /* <== */ cout << "Done\n\n"; cout << "Receiving...\n\n"; get = receive_message(); /* <== */ cout << "\n\nDone\n\n"; cout << get.length(); cout << get; system("PAUSE"); return 0; } /* ************************************************* */ void start(char* hostnameOrIp,int port) { s=socket(AF_INET,SOCK_STREAM,0); if(s==INVALID_SOCKET) { error_b = 1 ; error += "Could not create Socket!\n"; return ; } memset(&addr,0,sizeof(SOCKADDR_IN)); addr.sin_family=AF_INET; addr.sin_port=htons(port); rc=getAddrFromString(hostnameOrIp,&addr); rc=connect(s,(SOCKADDR*)&addr,sizeof(SOCKADDR)); if(rc==SOCKET_ERROR) { error_b = 1 ; error += "Could not connect to server!\n"; } } /* ************************************************* */ void send_message(char* message) { rc = send(s,message,strlen(message),0); if(rc==SOCKET_ERROR) { error_b = 1 ; error += "Could not send message!\n"; } } /* ************************************************* */ string receive_message(void) { string received; char buf[MAX_SIZE]; do{ rc = recv(s,buf,MAX_SIZE,0); if(rc==0) { error_b = 1 ; error += "Disconnected!\n"; } if(rc==SOCKET_ERROR) { error_b = 1 ; error += "Recv failed!\n"; } received += buf; cout << rc << endl; }while(error_b == 1 || rc >= MAX_SIZE); return received; } /* ************************************************* */ /* ************************************************* */ int startWinsock(void) { WSADATA wsa; return WSAStartup(MAKEWORD(2,0),&wsa); } /* ************************************************* */ long getAddrFromString(char* hostnameOrIp, SOCKADDR_IN* addr) { long rc; unsigned long ip; HOSTENT* he; if(hostnameOrIp==NULL || addr==NULL) return SOCKET_ERROR; ip=inet_addr(hostnameOrIp); if(ip!=INADDR_NONE) { addr->sin_addr.s_addr=ip; return 0; } else { he=gethostbyname(hostnameOrIp); if(he==NULL) { return SOCKET_ERROR; } else { memcpy(&(addr->sin_addr),he->h_addr_list[0],4); } return 0; } }
-
Die Bedingung
}while(error_b == 1 || rc >= MAX_SIZE);sieht falsch aus. Brich die Schleife ab, wenn recv 0 oder SOCKET_ERROR liefert.
-
Danke scheint alles zu klappen

-
Schnellschuss

Tut mir leid wegen dem Doppelpost aber gerade merke ich das er immer noch nicht alles bekommt/ausliest.
Bei der einen Seite ist get.length() 6150,bei der anderen 19475,aber den gesammten Inhalt bekomm ich nie
Die Funktion:string NetSocket::receive_message(void) string received; char buf[MAX_SIZE]; int lol; do{ rc = recv(s,buf,MAX_SIZE,0); lol += rc; if(rc==SOCKET_ERROR) { error_b = 1 ; error += "Recv failed!\n"; } received += buf; }while(rc != 0 && rc != SOCKET_ERROR ); return received; }Schon mal vielen Dank

-
Las dir das öfter zu senden und recv sollange bis das klappt, das könnte unter umständen deinen Fehler beheben.
Weiterhin wenn du den buffer ausgibst steht da Müll drinne, wenn ja setze im buffer an der position rc '\0'
-
du musst die append memberfunktion von string nehmen oder den buffer null terminieren.
-
Meinte ich doch
-
Dieser Thread wurde von Moderator/in evilissimo aus dem Forum C++ in das Forum WinAPI verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Danke,jetzt klappt alles

*hofftdasesdiesmalwirklichklappt*