recv -> nur mist im Buffer und Wsa Error
-
Juhu ich muss schon wieder mal nerven
Wieder ein Problem mit sockets und diesmal folgendes: Ich hab einfach nur einen Request an einen Server gesendet (siehe unten) und will dann die Antwort des Servers einfangen. Doch leider steht im Buffer nur scheiße und das steht auch erst nach ein paar geschmeidigen Minuten der Zeit des wartens da. Der WSA Error meint die connection sei getrennt worden (mit Macht) sprich ein TIMEOUT. Ich denke einfach der String, den ich an den server sende ist falsch. Rauskommen soll dabei eine Seite, nämlich (wie immer) die heise.de Startseite.int sockSendData(SOCKET getSock) { char *sendString = "GET / HTTP/1.1\r\nHost: www.heise.de\r\n"; int getErrorSendSock; getErrorSendSock = send(getSock,sendString,strlen(sendString),0); int dataSend = getErrorSendSock; if (getErrorSendSock == 0) { sockTestError(getSock,2); return 0; } else { cout << "ISC: 2 Successfull!\n"; return getErrorSendSock; } }
das hier ist die send funktion.
. . // connect so socket zeuchs... . . long testVar; testVar = connect(testSock,(SOCKADDR*)&connectionAddr,sizeof(SOCKADDR_IN)); //connectebefehl mit pointerverweis sockTestError(testVar,1); //prüft Verbindung auf Fehler -> sockfunc.h // // -- hier soll er die daten auffangen... --- // int bytesSent; bytesSent = sockSendData(testSock); // Funktion, die weiter oben steht cout << bytesSent << " bytes send to host: " << hp->h_name << "\n"; char getBuffer[bufSize]; // der buffer int getBufferSizeLeft; //um buffersize abzugleichen getBufferSizeLeft = bufSize; int bytesRead; //sagt nachher, wie viele bytes ich schon gelesen habe und ich noch zu lesen brauche... bytesRead = 0; while (bytesSent > 0) { bytesSent = recv(testSock, &getBuffer[bytesRead],getBufferSizeLeft-bytesRead, 0);//er schreibt zeuchs in getBuffer, sollte nicht alles beim ersten mal schreiben mitgekommen sein, steht das dann nachher in bytesSent. bytesRead += bytesSent; } cout << getBuffer; wsaClose(testSock); return 0; }
-
char getBuffer[bufSize];
Du hast den Buffer nicht mit Werten initialisiert, also steht das drin was gerade im Speicher warDu empfängst solange Daten bis dem Buffer voll ist, nur das Problem dabei ist, dass wenn keine Daten mehr kommen, blockt recv halt bis ein Timeout kommt. Du müsstes also die angekommen Daten parsen oder ne Option mitgeben, dass der Server die Verbdinung wieder beendet, wenn keine Daten mehr da sind. Diese Option gibt es in HTTP aber auswending weiß ich diese auch nicht.
-
seth`- schrieb:
char *sendString = "GET / HTTP/1.1\r\nHost: www.heise.de\r\n";
versuch mal so:
char *sendString = "GET / HTTP/1.0\r\nHost: www.heise.de\r\n\r\n";
btw: normalerweise bricht ein webserver die verbindung ab, nachdem er die seite übertragen hat, aber bei dir scheint es tatsächlich ein timeout zu sein, weil er den http-request nicht erkennt (fehlt ein \r\n am ende);
-
jawoll, dass klappt
danke net, so klappts