tutorials.de Buch-Aktion 05/2012
Like Tree1Danke
  • 1 Beitrag von deepthroat
ERLEDIGT
NEIN
ANTWORTEN
8
ZUGRIFFE
513
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Avatar von vfl_freak
    vfl_freak vfl_freak ist offline Mitglied Diamant
    Registriert seit
    Aug 2007
    Ort
    Niedersachsen
    Beiträge
    2.161
    Hallo zuammen,

    ich sitze hier seit zwei Tagen an dem Problem mittels C/C++ eine (passwortgeschüzte) PHP-Datei von einem Webserver auszulesen ...

    Habe hierzu inzwischen die libcurl gefunden! Ein normales perfom klappt wunderbar - die gesuchten Daten werden im Tool angezeigt!
    Nun doktere ich damit rum, einen HTTP-Request zu senden, um die ankommenden Daten in einen Buffer auszulesen und dann weiter zu verarbeiten!

    Dabei handele ich mir stets ein "bad request" ein.

    Die Webadresse (die sich natürlich auch über einen Browser aufrufen lässt) ist grundlegend wie folgt aufgebaut:

    https://user:passwort@www.derserver....1/dir2/csv.php

    Ich habe nun in den verschiedensten Form versucht, das GET abzusetzen, bekomme aber mit schöner Regelmäigkeit nur das erwähnte "bad request" zurück.

    Aktuell sieht der Aufruf so aus:

    Code :
    1
    2
    
     
    const char *request = "GET /dir1/dir2/csv.php HTTP/1.1\r\nHost: http://user:passwort@www.derserver.com\r\n\r\n";

    Habe Versuche mit:
    http und https
    HTTP/1.0 und HTTP/1.1
    mit und ohne User/Passwort
    mit und ohne Pfad vor der php-Datei
    usw. usw. .....

    Hat irgendwer noch eine Idee, was am meiner Syntax falsch sein könnte

    Hier noch mal der gesamte Code der kleinen Testapplikation:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    
    #include "stdafx.h"
    #include <string>
    #include <stdio.h>
    #include <curl/curl.h>
    #include <curl/easy.h>
     
    using namespace std;
     
    /* Auxiliary function that waits on the socket. */
    static int wait_on_socket( int sockfd, int for_recv, long timeout_ms )
    {
        struct timeval tv;
        fd_set infd, outfd, errfd;
        int res;
        
        tv.tv_sec = timeout_ms / 1000;
        tv.tv_usec= (timeout_ms % 1000) * 1000;
        
        FD_ZERO( &infd );
        FD_ZERO( &outfd );
        FD_ZERO( &errfd );
        
        FD_SET( (u_int)sockfd, &errfd ); /* always check for error */
        
        if( for_recv )
        {
            FD_SET( (u_int)sockfd, &infd );
        }
        else
        {
            FD_SET( (u_int)sockfd, &outfd );
        }
        
        /* select() returns the number of signalled sockets or -1 */
        res = select( sockfd + 1, &infd, &outfd, &errfd, &tv );
     
        return res;
    } // wait_on_socket
     
     
    int main( void )
    {
        CURL *curl;
        CURLcode res;
     
        int sockfd; /* socket */
        size_t iolen = 0;
     
        curl = curl_easy_init();
        if( curl ) 
        {
            curl_easy_setopt( curl, CURLOPT_PROXY, "aaa.bbb.ccc.ddd:8080" ); 
            curl_easy_setopt( curl, CURLOPT_URL, "http://www.derserver.com/dir1/dir2/csv.php" );
            curl_easy_setopt( curl, CURLOPT_USERPWD, "user:passwort" ); 
     
            /* Do not do the transfer - only connect to host */
            curl_easy_setopt( curl, CURLOPT_CONNECT_ONLY, 1L );
     
            res = curl_easy_perform( curl );
     
            if( CURLE_OK != res )
            {
                printf( "Error: %s\n", strerror(res) );
                return 1;
            }
     
            // /* Extract the socket from the curl handle - we'll need it for waiting */
            res = curl_easy_getinfo( curl, CURLINFO_LASTSOCKET, &sockfd );
     
            if(CURLE_OK != res)
            {
                printf( "Error: %s\n", strerror(res) );
                return 1;
            }
     
            puts("Sending request.");
            /* Minimalistic http request */
            const char *request = "GET /dir1/dir/csv.php HTTP/1.1\r\nHost: http://user:passwort@www.derserver.com\r\n\r\n";
     
     
            /* Send the request. Real applications should check the iolen
             * to see if all the request has been sent */
            res = curl_easy_send( curl, request, strlen(request), &iolen );
     
            if(CURLE_OK != res)
            {
                printf("Error: %s\n", strerror(res));
                return 1;
            }
     
            string strResult = "";
     
            puts("Reading response ...");
            for(;;)
            {
                char buf[1024]; 
     
                int iRes = wait_on_socket( sockfd, 1, 60000L );
                printf( "wait_on_socket <%u> = <%u> ...\n", sockfd, res );
                if( -1 == iRes )
                {
                    break;
                }
     
                res = curl_easy_recv( curl, buf, 1024, &iolen );
                printf( "curl_easy_recv <%u> = <%u> ...\n", sockfd, res );
                if( CURLE_OK != res )
                {
                    break;
                }
     
                strResult += string(buf);
                printf( "Received %u bytes.\n", iolen );
            }
     
     
            /* always cleanup */ 
            curl_easy_cleanup( curl );
     
        } // if
      
        return 0;
    } // main

    BTW: muss die konkrete Adresse etc. leider aus Datenschutzgründen anonymisieren

    Danke Euch im voraus
    Gruß
    Klaus
     
    Es ist noch kein Meister vom Himmel gefallen - sonst hätte man schon längst seine Leiche gefunden !!

    Falls ich helfen konnte, wäre eine Bewertung oder ein Danke nett ;-)
    -------------------------------------------------------------------------------------------------
    Ich beantworte keine Fragen per PN !!
    Stellt Eure Fragen im Forum - dann haben alle etwas davon !!

  2. #2
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Hi.

    Versuch's mal so:
    Code :
    1
    2
    
    GET /dir1/dir2/csv.php HTTP/1.1
    host: www.derserver.com
    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  3. #3
    Avatar von vfl_freak
    vfl_freak vfl_freak ist offline Mitglied Diamant
    Registriert seit
    Aug 2007
    Ort
    Niedersachsen
    Beiträge
    2.161
    Moin deepthroat,

    Danke für die schnelle Antwort
    Klappt aber leider auch nicht ...

    Als Antwort sehe ich übrigens immer:
    "400 Bad Request
    ...
    BorderManager Information Alert"

    Gruß
    Klaus

    EDIT: Muss oder darf ich überhaupt hier die Einwahldaten mitangeben ? ? ?
    Geändert von vfl_freak (08.10.09 um 09:54 Uhr) Grund: EDIT !!
     
    Es ist noch kein Meister vom Himmel gefallen - sonst hätte man schon längst seine Leiche gefunden !!

    Falls ich helfen konnte, wäre eine Bewertung oder ein Danke nett ;-)
    -------------------------------------------------------------------------------------------------
    Ich beantworte keine Fragen per PN !!
    Stellt Eure Fragen im Forum - dann haben alle etwas davon !!

  4. #4
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Zitat Zitat von vfl_freak Beitrag anzeigen
    Als Antwort sehe ich übrigens immer:
    "400 Bad Request
    ...
    BorderManager Information Alert"
    Das ist ja erstmal eine Fehlermeldung vom Proxy. Irgendwie versteht der deinen Request nicht. Hast du es mal mit einem anderen Server probiert?
    Zitat Zitat von vfl_freak Beitrag anzeigen
    EDIT: Muss oder darf ich überhaupt hier die Einwahldaten mitangeben ? ? ?
    Nein, die Authentifizierung erfolgt später nachdem der Server eine 401 Antwort gegeben hat.

    Gibt es eigentlich einen Grund warum du nicht curl_easy_perform() verwendest?

    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  5. #5
    Avatar von vfl_freak
    vfl_freak vfl_freak ist offline Mitglied Diamant
    Registriert seit
    Aug 2007
    Ort
    Niedersachsen
    Beiträge
    2.161
    Hi deepthroat,

    Zitat Zitat von deepthroat Beitrag anzeigen
    Das ist ja erstmal eine Fehlermeldung vom Proxy. Irgendwie versteht der deinen Request nicht. Hast du es mal mit einem anderen Server probiert?
    Aha ... nicht der Gegenstelle
    Ja, mit einer simplen Adresse wie wetteronline_de ...
    Kommt aber genau das Gleiche ... hab's just nochmal getestet (klingt dann in der Tat eher nach unserem Proxy) .....

    Zitat Zitat von deepthroat Beitrag anzeigen
    Nein, die Authentifizierung erfolgt später nachdem der Server eine 401 Antwort gegeben hat.
    Ah, ok, wieder eine Erleuchtung

    Zitat Zitat von deepthroat Beitrag anzeigen
    Gibt es eigentlich einen Grund warum du nicht curl_easy_perform() verwendest?
    Ja, eigentlich schon!
    Wenn ich das easy_perform ohne vorheriges "CURLOPT_CONNECT_ONLY" aufrufe, sehe ich alle gewünschten Daten in der kleinen Applikation, die dann aufgerufen wird (übrigens ebenso, wenn ich deren Kommandozeilenversion verwende; die kannich dann sogar in eine Datei umlenken )

    Leider ist mein Chef der Meinung, dass das für unsere Anwender in der Buchhaltung zu komplex ist !
    Er möchte, dass das Ganze zu definierten Zeiten von einem Java-Client aus angestossen wird, dann im C++-Server die Daten runtergeladen und in speziellen Tabellen gespeichert werden ...
    Und so wie ich die cURL-Doko verstehe, kann ich aus dem cURL-Handle (CURL *curl nicht die Daten auslesen ...
    Oder kennst Du da vlt. einen gangbaren Weg ?
    Andersrum sollte wohl dieses Applikationsfenster besser nicht aufgehen

    Gruß
    Klaus
     
    Es ist noch kein Meister vom Himmel gefallen - sonst hätte man schon längst seine Leiche gefunden !!

    Falls ich helfen konnte, wäre eine Bewertung oder ein Danke nett ;-)
    -------------------------------------------------------------------------------------------------
    Ich beantworte keine Fragen per PN !!
    Stellt Eure Fragen im Forum - dann haben alle etwas davon !!

  6. #6
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Hi vfl_freak,
    Zitat Zitat von vfl_freak Beitrag anzeigen
    Kommt aber genau das Gleiche ... hab's just nochmal getestet (klingt dann in der Tat eher nach unserem Proxy) .....
    ... und ohne Proxy?
    Zitat Zitat von vfl_freak Beitrag anzeigen
    Wenn ich das easy_perform ohne vorheriges "CURLOPT_CONNECT_ONLY" aufrufe, sehe ich alle gewünschten Daten in der kleinen Applikation, die dann aufgerufen wird (übrigens ebenso, wenn ich deren Kommandozeilenversion verwende; die kannich dann sogar in eine Datei umlenken )

    Leider ist mein Chef der Meinung, dass das für unsere Anwender in der Buchhaltung zu komplex ist !
    Er möchte, dass das Ganze zu definierten Zeiten von einem Java-Client aus angestossen wird, dann im C++-Server die Daten runtergeladen und in speziellen Tabellen gespeichert werden ...
    Und so wie ich die cURL-Doko verstehe, kann ich aus dem cURL-Handle (CURL *curl nicht die Daten auslesen ...
    Doch, das geht alles. Siehe z.B. http://curl.haxx.se/libcurl/c/getinmemory.html
    Zitat Zitat von vfl_freak Beitrag anzeigen
    Andersrum sollte wohl dieses Applikationsfenster besser nicht aufgehen
    Du meinst, das du keine Konsolenfenster haben möchtest? Dann müßtest du aber eine Windows-Applikation erzeugen (PE Header Subsystem auf Windows GUI stellen).

    Gruß
    vfl_freak bedankt sich. 
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  7. #7
    Avatar von vfl_freak
    vfl_freak vfl_freak ist offline Mitglied Diamant
    Registriert seit
    Aug 2007
    Ort
    Niedersachsen
    Beiträge
    2.161
    tja, ohne Proxy geht gar nix, dann komme ich hier gar nicht erst raus (weiß den genauen Fehlercode im Moment nicht mehr genau) ....

    Du meinst, das du keine Konsolenfenster haben möchtest?
    Dann müßtest du aber eine Windows-Applikation erzeugen (PE Header Subsystem auf Windows GUI stellen).
    Nein in diesem Fall nicht, da unsere C++-Server uaf einem eigenen Rechner, auf dem es unseren Chef stört ...

    Doch, das geht alles. Siehe z.B. http://curl.haxx.se/libcurl/c/getinmemory.html
    oops, da habe ich irgendwie übersehen ....
    Wollte das Beispiel gerade mal testen, allerdings scheint ein Bug drin zu sein
    Der Rückgabewert der Funktion "myrealloc" ist "void*" und soll an einen "char*" gegeben werden, was mein Compiler gar nicht mag ...
    Muss ich mir nach der Pause mal anschauen ...

    Erst nochmal Danke für die super kompetente Hilfe

    Gruß
    Klaus
     
    Es ist noch kein Meister vom Himmel gefallen - sonst hätte man schon längst seine Leiche gefunden !!

    Falls ich helfen konnte, wäre eine Bewertung oder ein Danke nett ;-)
    -------------------------------------------------------------------------------------------------
    Ich beantworte keine Fragen per PN !!
    Stellt Eure Fragen im Forum - dann haben alle etwas davon !!

  8. #8
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Zitat Zitat von vfl_freak Beitrag anzeigen
    Der Rückgabewert der Funktion "myrealloc" ist "void*" und soll an einen "char*" gegeben werden, was mein Compiler gar nicht mag ...
    Man kompiliert ja auch keinen C Code mit einem C++ Compiler...

    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  9. #9
    Avatar von vfl_freak
    vfl_freak vfl_freak ist offline Mitglied Diamant
    Registriert seit
    Aug 2007
    Ort
    Niedersachsen
    Beiträge
    2.161
    ok, auch wieder wahr .....

    tja, jetzt sich mein Chef während meiner Mittagspause doch wieder um entschieden, weil es ihm alles zu lange dauerte ...
    Wir machen es jetzt doch so, wie ich es schon ganz zu Anfang vorgeschlagen hatte ... nämlich mit dem JavaClient. Da sind es dann nur ein paar Zeilen mit der Klasse URL!

    Aber werde mir das Thema hier mal auf Termin legen und beizeiten, wenn dann mal Zeit ist, nochmals angehen! Es muss ja nun auch unter C/C++ gehen

    Nochmals Danke für Die Hilfe ...

    tschüss
    Klaus
     
    Es ist noch kein Meister vom Himmel gefallen - sonst hätte man schon längst seine Leiche gefunden !!

    Falls ich helfen konnte, wäre eine Bewertung oder ein Danke nett ;-)
    -------------------------------------------------------------------------------------------------
    Ich beantworte keine Fragen per PN !!
    Stellt Eure Fragen im Forum - dann haben alle etwas davon !!

Ähnliche Themen

  1. Ajax Request klappt nicht
    Von Verdemis im Forum Javascript & Ajax
    Antworten: 5
    Letzter Beitrag: 28.10.08, 14:44
  2. Problem mit curl request
    Von inter-medien im Forum PHP
    Antworten: 0
    Letzter Beitrag: 17.04.08, 00:44
  3. Curl http upload
    Von Shouter im Forum Linux & Unix
    Antworten: 0
    Letzter Beitrag: 06.07.07, 18:06
  4. Antworten: 1
    Letzter Beitrag: 22.10.06, 21:53