Sessions



  • der request sieht so aus:

    GET /content/news/index.php HTTP 1.0
    Host: www.futures-net.de

    die \r\n werden ja bei der ausgabe vom compiler interpretiert. is das vl der fehler?



  • wie sieht dein quellcode im moment aus?



  • im moment sieht der so aus:

    /*	INFORMATIONEN ZUM PROGRAMM:
      *	* * * * * * * * * * * * * * * * * * * * * * *
      *
      *	Sinn und Zweck:
      *	==============
      *	Socketverbindung zu entferntem Server um Datei anzusprechen
      *
      *	Hilfe, Tutorials, MSDN, etc.:
      *	=========================
      *	RFC zu HTTP		>>>>>		http://www.faqs.org/rfcs/rfc2616.html
      *	CodingCommunity		>>>>>		http://www.codingcommunity.de/wbb2/thread.php?postid=17671#post17671
      *	c-plusplus.net Forum	>>>>>		http://www.c-plusplus.net/forum/viewtopic-var-p-is-890601.html#890601
      *	C++ Forum			>>>>>		http://www.fun-soft.de/showtopic.php?threadid=12887&post_start=lastpage&time=1129121979
      *	Socket Tutorial		>>>>>		http://beej.us/guide/bgnet/output/htmlsingle/bgnet.html#sendrecv
      *
      *	Einbinden in Günthers Programm:
      *	============================
      *	Ausgaben entfernen & Zielserver, Verzeichnisstruktur, etc. im Konstruktor statisch festlegen
      */
    
    #include <iostream>
    #include <string>
    #include <stdlib.h>
    using namespace std;
    #include <winsock.h>
    
    //
    //	CHttpRequest
    //
    class CHttpRequest
    {
    	private:
    		string m_strServer;			//	Name des Zielservers (z.b. www.microsoft.com)
    		string m_strFolder;			//	Serververzeichnis der Zieldatei
    		string m_strUrl;			//	Komplette Ziel-URL (z.b. www.microsoft.com/windows/default.aspx)
    		char m_szIp[20];			//	IP Adresse des Zielservers, ermittelt nach dem Name
    		char m_szRespose[ 1000 ];	//	variable für die HTTP-Response
    
    		SOCKET m_Socket;			//	Für Socketverbindung
    		WSADATA m_wsaData;			//	Für Socketverbindung
    		sockaddr_in m_Address;		//	Für Socketverbindung
    
    	public:
    
    		//
    		//	Konstruktor
    		//
    		CHttpRequest( void )
    		{
    			//	Initialisieren mit leeren Werten
    			this->m_strServer = "";
    			this->m_strFolder = "";
    			this->m_strUrl = "";
    			strcpy( this->m_szIp, "" );
    			strcpy( this->m_szRespose, "" );
    		}
    
    		//
    		//	Destruktor
    		//
    		~CHttpRequest( void )
    		{
    			WSACleanup();
    		}
    
    		//
    		//	URL einlesen und IP ermitteln
    		//
    		void SetServerInformation( void )
    		{
    			if( 0 != WSAStartup( MAKEWORD(1,2), &this->m_wsaData) )
    				cout << "WSA konnte nicht initialisiert werden.";
    
    			//	URL einlesesn
    			cout << endl << "  Server eingeben (z.b. www.microsoft.com):" << endl << "  >> ";
    			cin >> this->m_strServer;
    
    			//	Verzeichnis einlesen
    			cout << endl << "  Verzeichnis eingeben (z.b. /windows/default.aspx):" << endl << "  >> ";
    			cin >> this->m_strFolder;
    
    			// 	URL zusammensetzen
    			this->m_strUrl = this->m_strServer + this->m_strFolder;
    
    			//	IP ermitteln
    			hostent *dns = gethostbyname( this->m_strServer.c_str() );
    			sprintf( this->m_szIp, "%u.%u.%u.%u",
    				( unsigned char ) dns->h_addr_list[0][0], ( unsigned char ) dns->h_addr_list[0][1],
    				( unsigned char ) dns->h_addr_list[0][2], ( unsigned char ) dns->h_addr_list[0][3] );
    
    			//	Ausgabe
    			cout << endl << "  IP Adresse des Servers:" << endl << "  >> " << this->m_szIp << endl;
    			cout << endl << "  Zielverzeichnis:" << endl << "  >> " << this->m_strUrl << endl;
    		}
    
    		//
    		//	Verbindung aufbauen
    		//
    		void Connect( void )
    		{
    			//	Socket erstellen
    			m_Address.sin_family = AF_INET;
    			m_Address.sin_port = htons( 80 );	// 80 = Port
    			m_Address.sin_addr.s_addr = inet_addr( this->m_szIp);
    
    			//	Socket initialisieren
    			this->m_Socket = socket( AF_INET, SOCK_STREAM, 0);
    			if( 0 == this->m_Socket )
    				cout << endl << "  Statusmeldung" << endl << "  >> Fehler - Socket konnte nicht initialisiert werden.";
    
    			//	Verbindung aufbauen
    			if( -1 == connect( ( SOCKET ) this->m_Socket, ( sockaddr * ) &this->m_Address, sizeof( this->m_Address ) ) )
    				cout << endl << "  Statusmeldung" << endl << "  >> Fehler - Verbindung konnte nicht hergestellt werden.";
    
    			//	Port zuweisen	Nötig ???
    			//bind( ( SOCKET ) this->m_Socket, ( sockaddr * ) &this->m_Address, 0 );
    		}
    
    		//
    		//	HTTP Request ausführen
    		//
    		void DoHttpRequest( void )
    		{
    			//	Request zusammenstellen und abschicken
    			//string strRequestMessage = "GET " + this->m_strUrl + " HTTP/1.1";
    			//string strRequestMessage = "GET " + this->m_strFolder + " \r\n\r\n HTTP/1.0 \r\n Host: " + this->m_strServer + " \r\n \r\n";
    			string strRequestMessage =	"GET " + this->m_strFolder +" HTTP/1.1\r\n" + "Referer: " + this->m_strServer + "\r\n" +
    										"User-Agent: IG Application\r\nAccept-Charset: windows-1252, utf-8, utf-16, iso-8859-1;q=0.6, *;q=0.1\r\n" +
    										"Host: " + this->m_strServer + "\r\n" + "Accept-Encoding: chunked\r\n\r\n";
    			cout << endl << strRequestMessage;
    
    			//	Request erfolgreich ausgeführt
    			if( send( (SOCKET) this->m_Socket, strRequestMessage.c_str(), strlen( strRequestMessage.c_str() ), 0 ) )
    			{
    				//	Statusmeldung ausgeben
    				cout << endl << "  HTTP Request:" << endl << "  >> Uebertragung erfolgreich" << endl << endl << "  ";
    
    				//	Response auswerten und ausgeben
    				int nReciveStatus = recv( ( SOCKET ) this->m_Socket, this->m_szRespose, 1000, 5 );				
    
    				if( nReciveStatus > 0 )
    				{
    					cout << endl << "  HTTP Response:" << endl << "  >> " << this->m_szRespose;
    					this->m_szRespose[ nReciveStatus ] = 0;
    					cout << endl << "  >> " << this->m_szRespose;
    				}
    ///////////////////// DEBUG /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    				else
    					cout << "DEBUG: nReciveStatus = " << nReciveStatus << endl << "  " << WSAGetLastError();
    			}
    			//	Request fehlgeschlagen
    			else
    				cout << endl << "  >> Uebertragung nicht erfolgreich. Request konnte nicht ausgeführt werden." << endl << endl << "  ";
    
    		}
    
    		//
    		//	HTTP Response als string zurückgeben
    		//
    		string GetHttpResponse( void )
    		{
    			return (string) m_szRespose;
    		}
    
    		//
    		//	Verbindung beenden
    		//
    		void Close( void )
    		{
    			WSACleanup();
    		}
    };
    
    //
    //	Main
    //
    int main( void )
    {
    	CHttpRequest Request;
    
    	//	Methoden der Klasse aufrufen
    	Request.SetServerInformation();
    	Request.Connect();
    	Request.DoHttpRequest();
    	Request.Close();
    
    	//	Programmende
    	cout << endl << endl << endl << endl << "  ";
    	system( "pause" );
    	return 0;
    }
    

    die probleme liegen in edr DoHttpRequest()



  • was soll die 5 bei recv?



  • wurde mir in einem post weiter oben empfohlen



  • dann glaub nicht alles was man dir sagt und lies in der dokumentation nach.



  • hmmmmmmmmmmmmmmmmm

    in der doku stand 0 als letzer parameter, damit gings aber noch weniger als mit 5



  • aber du hattest ja selbst einfach 1000 beim letzten parameter eingesetzt. auch völlig schwachsinn.



  • na ja, benutz einfach 0 und such den fehler woanders. dort braucht man äußerst selten (sozusagen nie) etwas anderes als 0.



  • ok, aber wenn ich da wieder 0 hinschreibe, dann wartet der vergeblich auf eine antwort. haste du ne idee wo der fehler sein könnte? mir gehen die nämlich langsam aus



  • bei mir kommt was. eingaben sind:

    www.microsoft.com
    /



  • ES KLAPPT JUHU. das mit er 0 war genau richtig 🙂



  • ach übrigens: danke für eure hilfe. ihr habt echt was drauf



  • ray_ray schrieb:

    ach übrigens: danke für eure hilfe. ihr habt echt was drauf

    ironie-tags vergessen?



  • ray_ray schrieb:
    ach übrigens: danke für eure hilfe. ihr habt echt was drauf

    ironie-tags vergessen?

    trottel-tags vergessen?

    wie dem auch sein. da wir auch schonma beim thema http requests sind. gibt es eien möglichkeit ber http-befehl (z.b. als teil des header) logindaten für einen datenbankserver mitzuschicken? habe gehört, dass sowas schonmal gemacht wurde.



  • Du hast mich glaub falsch verstanden...
    Ich meinte du solltest anstatt der 1000 eine 5 machen (deshalb, weil ein Response sicher länger als 5 Bytes ist und es dadurch keine Verzögerung in recv geben sollte, wodurch natürlich nicht der ganze Response empfangen werden würde), da recv ansonsten versucht auch 1000 bytes zu lesen und erst nach einem timeout die Verbindung trennt.
    Wie hast dus jetzt gemacht?
    Einfach so 1000 bytes? Und recv verzögert sich nicht?
    Da einfach 1000 reinschreiben ist keine Lösung, da dann, wenn eine HtmlSeite z.B. 1 KB ist (1024 Bytes), diese nicht ganz empfangen werden würde (und der Response Header ist nichtmal mit eingerechnet).



  • revc() sieht jetzt so aus:

    int nReciveStatus = recv( ( SOCKET ) this->m_Socket, this->m_szRespose, 1000, 0 );
    

    das programm muss ja keien daten runterladen oder anzeogen. das ganze so für folgenden zweck gedacht.

    auf den server läuft n cms, die daten die da rein sollen sind aber (in ihrer struktur) nicht kompatibel. dafür liegt n skript auf dem server, der das passend macht. in dem admin-tool (ein c++ programm) is dann n butten um dieses skript ans laufen zu bringen. das ganze is per HTTP GET gemacht, weil man im browser ja auch einfach die url angeben kann und das skript läuft los. und (schlau wie ich bin 😉 ) dacht ich mir dann n browser macht doch im prinzip auch nix anderes als n GET absenden. wichtig is bei recv als rückgabe dann nur dass nicht -1 für einen fehler zurückkommt. wenn nämlich das GET erfolgreich war rennt das skript los und tut was es soll.

    danke für euren aufwand. ihr habt mir sehr geholfen.


Anmelden zum Antworten