c++ Linux HTTP GET

11/19/2012 20:08 Mozo_#1
Hallo,

kann mir einer helfen, mittels c++ auf Linux ein HTTP GET auszuführen?
Habe mir schon ein paar sachen über sockets angeguckt, werde daraus aber nicht schlau. Habe auch was von libcurl gelesen nur bekomme ich es damit nicht hin.
11/19/2012 21:27 Nightblizard#2
Wie schaut dein derzeitiger Ansatz denn aus?
11/19/2012 21:42 Mozo_#3
Da ich nicht meinen kompletten code posten möchte, hier ein paar ausschnitte zu den sockets:


Code:
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <netinet/in.h>
Code:
struct sockaddr_in r;
struct hostent *http;
char buff[1024];
char tempo[1024];
int port = 80;
int s;
Code:
r.sin_family = AF_INET;
		r.sin_port = htons(80);
		r.sin_addr.s_addr = INADDR_ANY;
 
   
        strcpy(tempo, "GET /test.php?data=asdasd HTTP/1.1\r\nHost: www.test.de\r\n\r\n");
        s=socket(AF_INET, SOCK_STREAM, 0);
		if((connect(s, (struct sockaddr *)&r, sizeof(r))) == -1)
		{ 
			Msg("failed!");
		}
		else
		{
			send(s, tempo , sizeof(tempo) , 0);
		}
		close(s);
hoffe damit kannst du was anfangen.. er sendet den get befehl nicht ab nur weis ich nicht warum. (ist wie gesagt das 1. mal das ich mit sockets arbeite)



EDIT:


Ich habe den Code zum senden jetzt so:
Code:
sprintf(tempo, "GET /bla/test.php?data=%s HTTP/1.1\r\nHost:www.test.de:80\r\n\r\n",test.c_str());
s=socket(AF_INET, SOCK_STREAM, 0);
		if((connect(s, (struct sockaddr *)&r, sizeof(r))) == -1)
		{ 
			Msg("failed!");
		}
		else
		{
			if(send(s, tempo , strlen(tempo) , 0) < 0)
			{
				Msg("Senden Fehlgeschlagen!\n");
			} else {
				Msg("Senden erfolgreich!\n");
				Msg(tempo);
			}
		}
		close(s);
die variable "test" ist so definiert (nur ein beispiel, wird im programm durch andere werte definiert):
Code:
std::string test = "2,4.2,5.2,100,0;2,-278.205,-598.403,100,0;3,548.266,2235.47,100,0;";
ich bekomme beim ausführen immer die Nachricht "Senden erfolgreich" und die variable "tempo" wird auch (in meinen augen) richtig ausgegeben:
Code:
GET /bla/test.php?data=3,-446.315,1674.19,100,0;2,-436.193,192.15,100,0; HTTP/1.1
Host:www.test.de:80
Nur kommt der GET befehl anscheinend nicht an dem PHP script an, denn dieses soll die daten in eine mysql datenbank eintragen, was es aber nicht macht. ich hoffe mir kann jemand helfen

Keiner der mir helfen kann?
11/20/2012 20:19 Tyrar#4
Code:
WSAData wsa;
WSAStartup(MAKEWORD(2,2),&wsa);
ansonsten solltest du auch mal den return wert der socket funktion auf -1 (INVALID_SOCKET) prüfen
dann solltest du auch überhaupt mal richtig connecten, du gibst als ziel adresse INADDR_ANY an, was definitiv falsch ist!
11/20/2012 20:25 Mozo_#5
Ist das WSAData und WSAStartup nicht nur für windows?
Was muss ich denn bei INADDR_ANY angeben? so wie ich das nachgelesen habe, akzeptiert er damit alle adressen

den socket üverprüfe ich doch schon mit:
Code:
if((connect(s, (struct sockaddr *)&r, sizeof(r))) == -1)
		{ 
			Msg("failed!");
		}
oder sehe ich das falsch?



okay, habe nun noch eine abfrage für den socket eingefügt, bekomme aber keinen error also sollte der ja stimmen.
Code:
if(s == -1)
{
	Msg("Socket Error");
}
11/20/2012 21:21 Tyrar#6
Quote:
Originally Posted by Mozo_ View Post
Ist das WSAData und WSAStartup nicht nur für windows?
Was muss ich denn bei INADDR_ANY angeben? so wie ich das nachgelesen habe, akzeptiert er damit alle adressen

den socket üverprüfe ich doch schon mit:
Code:
if((connect(s, (struct sockaddr *)&r, sizeof(r))) == -1)
		{ 
			Msg("failed!");
		}
oder sehe ich das falsch?



okay, habe nun noch eine abfrage für den socket eingefügt, bekomme aber keinen error also sollte der ja stimmen.
Code:
if(s == -1)
{
	Msg("Socket Error");
}
die 2. abfrage meinte ich, das INADDR_ANY gilt nur für server, nicht für clients!
da nutzt man z.b. inet_addr("127.0.0.1")
11/20/2012 21:47 Mozo_#7
auch mit inet_addr("127.0.0.1") funktioniert es nicht.
Er sagt mir weiterhin das der befehl gesendet wurde und tempo sieht so aus:
Code:
GET /bla/test.php?data=2,-428.213,443.497,100,0; HTTP/1.1
Host: www.test.de
11/21/2012 08:49 MrSm!th#8
Läuft der Server denn auf deinem PC?
11/21/2012 14:10 Mozo_#9
nein, muss ich also bei "inet_addr("127.0.0.1")" die ip von dem server eintragen auf dem das php script liegt?

Okay, habe es hinbekommen :)

Danke für eure Hilfe !
11/22/2012 17:39 MrSm!th#10
#closed