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 war

    Du 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 🙂


Log in to reply