Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » Session Probleme (HTTP Request)

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
12.10.2005, 15:00 Uhr
ray_ray



hallo
wundert euch nicht, ich bin neu hier.



nun zu meinem anliegen:
ich hab n progrämmchen in arbeit, in dem ich eine datei auf einem server ansprecen möchte. bin auch soweit, dass ich eine verbindung zum server über sessions gemacht hab.

nun gehts dann an den http-request. und ab da is das problem. denke der request ist gültig, aber es komtm keien antwort. ud da recv() solange wartet bis was gekommen is liegt das ganze programm flach. mir gehts aber nich darum irgenetwas anderes in dieser zeit zu abwickeln zu könenn, sondern die daten zu empfangen.

den request hab ich mit send() abgesetzt. hier ma n auszug aus der funktion. die socketverbindung ist vor dem auszug unten bereits aufgebaut.



Code:

//    Request zusammenstellen und abschicken
string strRequestMessage = "GET " + this->m_strUrl + " HTTP/1.1"; + " HTTP/1.1 Host: " + this->m_strServer;
cout << endl << "  HTTP Request:" << endl << "  >> " << strRequestMessage;


//    Request erfolgreich ausgeführt
if( send( (SOCKET) this->m_Socket, strRequestMessage.c_str(), strlen( strRequestMessage.c_str() ), 0 ) )
{
    //    Statusmeldung ausgeben
    cout << endl << "  >> Uebertragung erfolgreich" << endl << endl << "  ";
              
      
    //    Response auswerten und ausgeben
    char szOutput[ 1000 ];
    int nReciveStatus = recv( ( SOCKET ) this->m_Socket, szOutput, 1000, 0 );              
              
    if( nReciveStatus > 0 )
    {
        cout << endl << "  HTTP Response:" << endl << "  >> " << szOutput;
        szOutput[ nReciveStatus ] = 0;
        cout << endl << "  >> " << szOutput;
    }
}
//    Request fehlgeschlagen
else
    cout << endl << "  >> Uebertragung nicht erfolgreich" << endl << endl << "  ";





schonmal danke für eure hilfe
sebastian
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
12.10.2005, 16:19 Uhr
ray_ray



ich meine natürlich SOCKETS, nicht sessions
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
12.10.2005, 21:52 Uhr
Guybrush Threepwood
Gefürchteter Pirat
(Operator)


Also ich würde das ganze nicht über Sockets machen. Die Windows API stellt für sowas Funktionen bereit die das ganze einfacher machen.

Guck dir mal URLDownloadToFile oder InternetReadFile

bzw. FtpGetFile wenns ftp sein soll.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
12.10.2005, 23:44 Uhr
~CDW
Gast


so auf die schnelle: wo ist denn bei Deinem Request die abschließenden 2 Zeilen?
\r\n\r\n bzw. CRLF CRLF
*etwas eigenwerbung *
www.programmiersprachen.de/wbb2/thread.php?threadid=2927&hilight=gethttpfile
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
13.10.2005, 08:40 Uhr
ray_ray



mittlerweile sind diese 2 zeilen auch drin, aber es lüppt noch immer nich.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
13.10.2005, 08:57 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


dein request ist noch nicht ok. Ansonsten, wie erstellst du die verbindung (also wie erstellst du das socket)?

Weiterhin sollteste mit select prüfen, ob daten überhaupt anliegen. Und ob er den Request vollständig verschickt hat (retval von send ist die anzahl der verschickten bytes.

Ein korrekter HTTP1.1 Request sieht z.b so aus:


Code:
GET {$urld[path]}?{$urld[query]} HTTP/1.1
Referer: {$referer}
User-Agent: My Program v1.0
Accept-Charset: windows-1252, utf-8, utf-16, iso-8859-1;q=0.6, *;q=0.1
Host: {$urld[host]}
Accept-Encoding: chunked




die letzte "Leerzeile" ist wichtig.

Beispiel:


Code:
GET /showtopic.php?threadid=12887 HTTP/1.1
Referer: www.fun-soft.de
User-Agent: My Program v1.0
Accept-Charset: windows-1252, utf-8, utf-16, iso-8859-1;q=0.6, *;q=0.1
Host: www.fun-soft.de
Accept-Encoding: chunked



--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
13.10.2005, 09:42 Uhr
ray_ray



die send()-funktion sendet. hab mir angesehen, wieviel die funktion übertragen hat. das war ok. aber bei recv() bekomm ch immer -1 zurück. wenns kein fehler wär würde ich die anzahl der empfangenen bytes zurückbekommen.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
13.10.2005, 10:40 Uhr
ray_ray



ich hab jetzt auch probiert das ganze mit InternetOpen(), InternetConnect(), HttpOpenRequest() und HttpSendRequest() umzusetzen. der macht das auch alles nur versendet der nicht.

das problem sollte in meiner Request(), genauer in dem teil mit HttpSendRequest() sein, da Connect() ja korrekterweise true zurückliefert. weiß einer von euch warum? hier der qt:



C++:

/*    INFORMATIONEN ZUM PROGRAMM:
  *    * * * * * * * * * * * * * * * * * * * * * * *
  *
  *    Sinn und Zweck:
  *    ==============
  *    Verbindung zu entferntem Server um Datei anzusprechen
  *
  *    Hilfe, Tutorials, MSDN, etc.:
  *    =========================
  *    RFC zu HTTP        >>>>>        www.faqs.org/rfcs/rfc2616.html
  *    CodingCommunity        >>>>>        www.codingcommunity.de/wbb2/thread.php?postid=17671#post17671
  *    C-PlusPlus.de Forum    >>>>>        www.c-plusplus.de/forum/viewtopic-var-p-is-890601.html#890601
  *    C++ Forum            >>>>>        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 <wininet.h>


//
//    CHttpRequest
//
class CHttpRequest
{
    private:
        string m_strServer;                //    Zielserver
        string m_strTargetFolder;        //    Zielverzeichnis & -datei
        
        HINTERNET m_hInetOpen;            //    Return von InternetOpen()
        HINTERNET m_hInetConnect;        //    Return von InternetConnect()
        HINTERNET m_hInetOpenRequest;    //    Return von HttpOpenRequest()

    public:
        
        //
        //    Konstruktor
        //
        CHttpRequest( void )
        {
            this->m_strServer = "www.futures-net.de";
            this->m_strTargetFolder = "/content/news/index.php";
        }
        
        CHttpRequest( string strServer, string strTargetFolder )
        {
            this->m_strServer = strServer;
            this->m_strTargetFolder = strTargetFolder;
        }


        //
        //    Destruktor
        //
        ~CHttpRequest( void )
        {
            
        }


        //
        //    Verbindung herstellen
        //
        bool Connect( void )
        {
            this->m_hInetOpen = InternetOpen( "IG App", INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, INTERNET_FLAG_ASYNC );
            this->m_hInetConnect = InternetConnect( this->m_hInetOpen, this->m_strServer.c_str(), INTERNET_DEFAULT_HTTP_PORT, "User", "", INTERNET_SERVICE_HTTP, INTERNET_FLAG_PASSIVE, 0);
            
            if( this->m_hInetOpen != NULL && this->m_hInetConnect != NULL )
                return true;
        }

        //
        //    Request
        //
        bool Request( void )
        {
            //    HTTP Request
            this->m_hInetOpenRequest = HttpOpenRequest( this->m_hInetConnect, NULL, this->m_strTargetFolder.c_str(), NULL, NULL, NULL, INTERNET_FLAG_KEEP_CONNECTION, 0 );
            
            if( this->m_hInetOpenRequest != NULL )
            {
                if( true == HttpSendRequest( this->m_hInetOpenRequest, NULL, 0, NULL, 0 ) )
                {
                    return true;
                }
                else
                    cout << "FEHLER BEIM SENDEN";
            }
            else
                return false;
        }


        
};


//
//    Main
//
int main( void )
{
    CHttpRequest HttpRequest;
    
    
    if( true == HttpRequest.Connect() )
    {
        cout << endl << "  Connect successful";    
        if( true == HttpRequest.Request() )
            cout << endl << "  Request successful";
        else
            cout << endl << "  Request failed";
    }
    else
        cout << endl << "  Connect failed";    



    //    Programmende
    cout << endl << endl << "  ";
    system( "pause" );
    return 0;
}



Dieser Post wurde am 13.10.2005 um 10:51 Uhr von ray_ray editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
13.10.2005, 11:32 Uhr
ray_ray



ES KLAPPT JUHU

diese version die jetzt da oben gepostet ist, verwende ich nicht, sondern mache das alles über sockets. da waren ja auch ein paar fehler drin, jetzt funktioniert das alles aber. danke für eure hilfe. hoffe ich kann mich ma wenn ihr n prob habt revanchieren.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
13.10.2005, 16:01 Uhr
ray_ray



aber 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.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: