1Danke
ERLEDIGT
NEIN
NEIN
ANTWORTEN
8
8
ZUGRIFFE
513
513
EMPFEHLEN
-
08.10.09 09:34 #1
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ß
KlausEs 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 !!
-
08.10.09 09:41 #2
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
Hi.
Versuch's mal so:
GrußCode :1 2
GET /dir1/dir2/csv.php HTTP/1.1 host: www.derserver.com
If at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
08.10.09 09:46 #3
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 !!
-
08.10.09 11:06 #4
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
Das ist ja erstmal eine Fehlermeldung vom Proxy. Irgendwie versteht der deinen Request nicht. Hast du es mal mit einem anderen Server probiert?
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.
-
08.10.09 11:24 #5
Hi deepthroat,
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) .....
Ah, ok, wieder eine Erleuchtung
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ß
KlausEs 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 !!
-
08.10.09 11:59 #6
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
Hi vfl_freak,
... und ohne Proxy?
Doch, das geht alles. Siehe z.B. http://curl.haxx.se/libcurl/c/getinmemory.html
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ßIf at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
08.10.09 12:50 #7
tja, ohne Proxy geht gar nix, dann komme ich hier gar nicht erst raus (weiß den genauen Fehlercode im Moment nicht mehr genau) ....
Nein in diesem Fall nicht, da unsere C++-Server uaf einem eigenen Rechner, auf dem es unseren Chef stört ...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).
oops, da habe ich irgendwie übersehen ....Doch, das geht alles. Siehe z.B. http://curl.haxx.se/libcurl/c/getinmemory.html
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ß
KlausEs 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 !!
-
08.10.09 13:03 #8
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
If at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
08.10.09 14:19 #9
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
KlausEs 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
-
Ajax Request klappt nicht
Von Verdemis im Forum Javascript & AjaxAntworten: 5Letzter Beitrag: 28.10.08, 14:44 -
Problem mit curl request
Von inter-medien im Forum PHPAntworten: 0Letzter Beitrag: 17.04.08, 00:44 -
Curl http upload
Von Shouter im Forum Linux & UnixAntworten: 0Letzter Beitrag: 06.07.07, 18:06 -
mit cURL geladene Seite zeigt HTTP Headerinformationen
Von joergdeymann im Forum PHPAntworten: 1Letzter Beitrag: 22.10.06, 21:53





Zitieren
Login






