[C++] Http Request mag nicht funktionieren

03/02/2010 18:13 Shadow992#1
Edit :
Sorry ich war wohl etwas zu schnell ...
Mein Firewall hatte geblockt und deswegen bekam ich auch nie eine Antwort vom Server .
Der Code hat also gepasst (ich werde den post jetzt nicht löschen , da vielleicht einmal die Frage auftaucht wie man Http-Requests mit C++ machen kann)
Aber der Thread kann geclosed werden , hoffentlich reicht eine Entschuldigung an die Mods , um mir zu verzeihen :D


Post :
03/02/2010 22:44 xNopex#2
Wenn keine Fehler beim kompilieren kommen, keine Fehler zur Laufzeit erscheinen, kann es nur an dem Server liegen, oder an deiner Anfrage.

[Only registered and activated users can see links. Click Here To Register...]
[Only registered and activated users can see links. Click Here To Register...]

Der erste Link ist ein gutes Tut zum Thema Sockets, das auch u.a. das HTTP-Protokoll behandelt, vllt. das mal durchlesen und der zweite Link ist dafür da, wenn alle Stricke reißen:
Quote:
curl is a command line tool for transferring data with URL syntax, supporting FTP, FTPS, HTTP, HTTPS, SCP, SFTP, TFTP, TELNET, DICT, LDAP, LDAPS and FILE. curl supports SSL certificates, HTTP POST, HTTP PUT, FTP uploading, HTTP form based upload, proxies, cookies, user+password authentication (Basic, Digest, NTLM, Negotiate, kerberos...), file transfer resume, proxy tunneling and a busload of other useful tricks.
03/03/2010 18:21 Shadow992#3
Quote:
Originally Posted by xNopex View Post
Wenn keine Fehler beim kompilieren kommen, keine Fehler zur Laufzeit erscheinen, kann es nur an dem Server liegen, oder an deiner Anfrage.

[Only registered and activated users can see links. Click Here To Register...]
[Only registered and activated users can see links. Click Here To Register...]

Der erste Link ist ein gutes Tut zum Thema Sockets, das auch u.a. das HTTP-Protokoll behandelt, vllt. das mal durchlesen und der zweite Link ist dafür da, wenn alle Stricke reißen:
Da ich schon mehrere Packetbots (vorerst nur mit AutoIt) gemacht habe und es auch mit verschiedenen Seiten/Packets probiert habe , sollte es nicht an dem packet liegen .

Den ersten Link kenne ich bereits ,aber ich brauche kein Tutorial dazu wie Http funktioniert oder wie TCP funktioniert (weiß ich ja bereits von AutoIt) .
Den 2. Link will ich wirklich nur im äußersten Notfall verwenden , da ich mir selbst eine kleine Klasse schreiben wollte ...

Trotzdem danke für deinen Versuch mir zu helfen :D
03/03/2010 18:36 xNopex#4
Ich hab das ganze mal C++ vernünftig umgeschrieben und bei mir funktioniert folgender Code:

Code:
#include <windows.h>
#include <iostream>
#include <string>

using namespace std;
const int BUFFER_SIZE = 65535;

unsigned long GetIP( string host)
{
   struct hostent* hp;
   unsigned long host_ip;

    host_ip = inet_addr( host.c_str() );
    if( host_ip == INADDR_NONE )
    {
        hp = gethostbyname( host.c_str() );
        if( !hp )
        {
           return 0;
        }else
        {
           host_ip = *(unsigned long *)hp->h_addr;
       }
    }
    return host_ip;
}

string HTTPRequest( string server, int port, string request)
{
    WSADATA w;
    int res = WSAStartup( MAKEWORD( 2,0 ), &w );

    if( res != 0 )
    {
        cout << "Winsock 2 konnte nicht gestartet werden!\n";
        cin.get();
        return "fail";
    }
    else
    {
        cout << "Winsock 2 gestartet!\n";
    }

    SOCKET sSocket = socket( AF_INET, SOCK_STREAM, 0 );

    if( sSocket == INVALID_SOCKET)
    {
        cout << "Socket konnte nicht erstellt werden!\n";
        cin.get();
        return "fail";
    }
    else
    {
        cout << "Socket wurde erstellt!\n";
    }

    unsigned long ip = GetIP( server );

    SOCKADDR_IN service;
    memset( &service, 0, sizeof( SOCKADDR_IN ) );
    service.sin_family = AF_INET;
    service.sin_port = htons( port );
    service.sin_addr.s_addr = ip;

    res = connect( sSocket, (SOCKADDR *)(&service), sizeof( SOCKADDR ) );

    if( res == SOCKET_ERROR )
    {
        cout << "Verbindung fehlgeschlagen!\n";
        cin.get();
        return "fail";
    }
    else
    {
        cout << "Verbindung erfolgreich!\n";
    }

    res = send( sSocket, request.c_str(), request.size(), 0 );
    char buffer[BUFFER_SIZE];
    res = recv( sSocket, buffer, BUFFER_SIZE-1, 0);

    buffer[res] = '\0';
    WSACleanup();
    string out = buffer;
    return out;
}

int main()
{
	string request =
		"GET /search?hl=de&q=http+request&btnG=Google-Suche&meta= HTTP/1.1\r\n"
		"User-Agent: dein Browser\r\n"
		"Host: www.google.de\r\n"
		"Accept: */*\r\n"
		"Accept-Encoding: text/html\r\n\r\n";

	string temp = HTTPRequest("www.google.de", 80, request);
	if( temp == "fail" )
        return 1;

    cout << temp << "\n";
    cin.get();
    return 0;
}
Ich hoffe bei dri geht er auch :)

EDIT: Schade, zu spät...