Anzeige:
Ergebnis 1 bis 6 von 6

Thema: HTTP-POST über socket

  1. #1
    Registrierter Benutzer Avatar von Giuly
    Registriert seit
    28.04.2003
    Ort
    HB-Nord
    Beiträge
    201

    HTTP-POST über socket

    Hi,
    ich will etwas per POST an einen Server senden, allerdings bekomme ich immer einen BAD REQUEST-Error. Egal was ich mache.
    Per wget gehts allerdings:
    Code:
    wget  --post-data="a=b" http://foo.bar.com/index.php -O foo.html -o /dev/null
    Kann mir jemand sagen, wie der Request dazu aussehen muss?

    Hat ausserdem jemand eine urlencode-Funktion in C? Ich will dafür nicht eine ganze Lib benutzten.

    MfG Giuly

    So, ich hab mich jetzt dazu entschlossen cURL zu benutzten. kann mir aber mal jemand erklären, wie ich eine Seite in einen char* lesen kann? Bei den Examples hab ich da nichts brauchbares gefunden.

    Das hab ich jetzt auch gelöst per http://cool.haxx.se/cvs.cgi/curl/doc...viewcvs-markup

    Jetzt brauch ich nurnoch irgendwas um zu zählen wieoft ein string in einem anderem vorkommt, aber das kriege ich auch selber hin (Sonst wird hier nochmal editiert
    Geändert von Giuly (07-11-2005 um 01:37 Uhr)

  2. #2
    Registrierter Benutzer Avatar von Giuly
    Registriert seit
    28.04.2003
    Ort
    HB-Nord
    Beiträge
    201
    Code:
    int strcnt(const char* haystack, char* needle) {
      char* hays=malloc(sizeof(char)*strlen(haystack));
      strcpy(haystack, hays);
      int pos=-1, times=0;
      while((pos=strstr(hays, needle)) != NULL) {
        times++;
        strncpy (hays,"",pos);
      }
      return times;
    }
    Das hab ich bis jetzt, funktioniert nur nicht.
    Wie geht das richtig?

  3. #3
    Registrierter Benutzer
    Registriert seit
    30.06.2005
    Beiträge
    155
    also auf den ersten blick würd ich mal sagen, dass jedenfalls das strcpy falsch ist.
    Code:
    strcpy(haystack, hays);
    du kopierst vom (gerade allokierten und leeren) buffer hays in deinen parameter haystack, das sollte wohl umgekehrt laufen...

  4. #4
    Registrierter Benutzer Avatar von undefined
    Registriert seit
    01.03.2004
    Beiträge
    1.255
    Ich habe hier noch eine Übungsaufgabe die ich mal für CGI Programmierung gemacht habe. Das hilft dir vielleicht weiter.
    PHP-Code:

    #ifdef HAVE_CONFIG_H
    #include <config.h>
    #endif

    #include <iostream>
    #include <cstdlib>
    #include <string.h>
    #include <vector>

    using namespace std;

    struct ListElement
    {
            
    ListElementnaechstes;
            
    string       schluessel;
            
    string       wert;
            
    // __construct
            
    ListElement() : naechstes(0)
            {}
            
    // __construct erweitert
            
    ListElement( const string_schluessel, const string_wert ) :
                            
    naechstes),
                            
    schluessel_schluessel ),
                            
    wert_wert )
            {}
    }
    ;

    class 
    Liste
    {
    private:
            
    ListElementerstes;
            
    ListElementletztes;
            
    int anzahl;
    public:
            
    Liste() : erstes), letztes), anzahl)
            {}
            
    virtual ~Liste();

            
    bool empty() const
            {
                    return ( 
    anzahl == );
            }

            
    int size() const
            {
                    return 
    anzahl;
            }

            
    void push_back( const stringschluessel, const stringwert );

            
    void pop_front();

            
    ListElementfront()
            {
                    return 
    erstes;
            }
    };

    void Liste::push_back( const string_schluessel, const string_wert )
    {
            
    ListElementtmp = new ListElement_schluessel_wert );

            if ( 
    letztes != )
                    
    letztes->naechstes tmp;
            else
                    
    erstes tmp;

            
    letztes tmp;
            
    anzahl++;
    }

    void Liste::pop_front()
    {
            if ( 
    anzahl == )
                    return;

            
    ListElementtmp erstes;
            
    erstes tmp->naechstes;

            if ( 
    erstes == )
                    
    letztes == 0;

            
    delete tmp;
            
    anzahl--;
    }

    Liste::~ Liste()
    {
        while( 
    anzahl != )
            
    pop_front();
    }

    bool AnfrageListe_liste )
    {
            
    string request_method getenv"REQUEST_METHOD" );

            
    // Puffer fuer uebergeben Daten
            
    charbuffer 0;
            
    unsigned int len;

            
    // Behandle Post Variablen
            
    if ( request_method == "POST" ) {
                    
    len atoigetenv"QUERY_STRING" ) );
                    
    buffer = new char[len 1];
                    for ( 
    unsigned int i 0leni++ ) {
                            
    cin.getbuffer[i] );
                    }
            }

            
    // Behandle GET Variablen
            
    if ( request_method == "GET" ) {
                    
    len strlengetenv"QUERY_STRING" ) );
                    
    buffer = new char[len+1];
                    
    strcpybuffergetenv"QUERY_STRING" ) );
            }

            
    // Terminieren
            
    buffer[len] = 0;

            
    // Kopiere Puffer in String
            
    string eingabe buffer;
            
    delete[] buffer;

            
    // Lokale Variablen zur Teilstring Suche
            
    size_t pos 0;
            
    size_t old_pos 0;

            
    // Lese Werte Paare
            
    while ( pos len ) {
                    
    pos eingabe.find"&"old_pos );
                    
    // Ein oder mehrer parameter wurden uebergeben ?
                    
    if ( pos == string::npos )
                            
    pos eingabe.length();

                    
    // Splitten
                    
    string paar eingabe.substrold_pospos-old_pos );
                    
    size_t eq_pos paar.find("=");

                    
    string schluessel paar.substr0eq_pos );
                    
    // Funktion zum Konvertieren von Leerzeichen( schluessel );

                    
    string wert paar.substreq_pos );
                    
    // Funktion zum Konvertieren von Leerzeichen( schluessel );

                    // Erstelle Liste
                    
    _liste.push_backschluesselwert );
                    
    old_pos pos 1;
            }

    }

    void AntworteListe_liste )
    {
            
    cout << "Content-Type: text/html" << endl;
            
    cout << endl;
            
    cout << "<html><title>C++ Beispiel CGI GET/POST Beispiel</title>" << endl;
            
    cout << "<head>" << endl;
            
    cout << "<body><h2>Ausgabe</h2>" << endl;

            
    ListElementtmp;
            for( 
    tmp _liste.front(); tmp != 0tmp tmp->naechstes ) {
                    
    cout << "<p><b>" << tmp->schluessel << "</b>" << tmp->wert << "</p>" << endl;
            }

            
    cout << "</body>" << endl;
            
    cout << "</head>" << endl;
            
    cout << "</html>" << endl;
    }


    int main()
    {
            
    Liste liste;

            if ( 
    Anfrageliste ) == false ) {
                    
    cout << "Content-Type: text/html" << endl;
                    
    cout << endl;
                    
    cout << "<html><title>C++ Beispiel CGI GET/POST Beispiel</title>" << endl;
                    
    cout << "</head><body>Keine Anfrage erhalten!" << endl;
                    
    cout << "</body>" << endl;
                    
    cout << "</head>" << endl;
                    
    cout << "</html>" << endl;
            } else
                    
    Antworteliste );

            return 
    EXIT_SUCCESS;

    mfg undefined
    --
    Undefined Behavior (undefiniertes Verhalten) bedeutet meistens etwas ungültiges.
    xhtml Debugger

  5. #5
    Registrierter Benutzer Avatar von Giuly
    Registriert seit
    28.04.2003
    Ort
    HB-Nord
    Beiträge
    201
    Zitat Zitat von undefined
    Ich habe hier noch eine Übungsaufgabe die ich mal für CGI Programmierung gemacht habe. Das hilft dir vielleicht weiter.
    PHP-Code:

    #ifdef HAVE_CONFIG_H
    #include <config.h>
    #endif

    #include <iostream>
    #include <cstdlib>
    #include <string.h>
    #include <vector>

    using namespace std;

    struct ListElement
    {
            
    ListElementnaechstes;
            
    string       schluessel;
            
    string       wert;
            
    // __construct
            
    ListElement() : naechstes(0)
            {}
            
    // __construct erweitert
            
    ListElement( const string_schluessel, const string_wert ) :
                            
    naechstes),
                            
    schluessel_schluessel ),
                            
    wert_wert )
            {}
    }
    ;

    class 
    Liste
    {
    private:
            
    ListElementerstes;
            
    ListElementletztes;
            
    int anzahl;
    public:
            
    Liste() : erstes), letztes), anzahl)
            {}
            
    virtual ~Liste();

            
    bool empty() const
            {
                    return ( 
    anzahl == );
            }

            
    int size() const
            {
                    return 
    anzahl;
            }

            
    void push_back( const stringschluessel, const stringwert );

            
    void pop_front();

            
    ListElementfront()
            {
                    return 
    erstes;
            }
    };

    void Liste::push_back( const string_schluessel, const string_wert )
    {
            
    ListElementtmp = new ListElement_schluessel_wert );

            if ( 
    letztes != )
                    
    letztes->naechstes tmp;
            else
                    
    erstes tmp;

            
    letztes tmp;
            
    anzahl++;
    }

    void Liste::pop_front()
    {
            if ( 
    anzahl == )
                    return;

            
    ListElementtmp erstes;
            
    erstes tmp->naechstes;

            if ( 
    erstes == )
                    
    letztes == 0;

            
    delete tmp;
            
    anzahl--;
    }

    Liste::~ Liste()
    {
        while( 
    anzahl != )
            
    pop_front();
    }

    bool AnfrageListe_liste )
    {
            
    string request_method getenv"REQUEST_METHOD" );

            
    // Puffer fuer uebergeben Daten
            
    charbuffer 0;
            
    unsigned int len;

            
    // Behandle Post Variablen
            
    if ( request_method == "POST" ) {
                    
    len atoigetenv"QUERY_STRING" ) );
                    
    buffer = new char[len 1];
                    for ( 
    unsigned int i 0leni++ ) {
                            
    cin.getbuffer[i] );
                    }
            }

            
    // Behandle GET Variablen
            
    if ( request_method == "GET" ) {
                    
    len strlengetenv"QUERY_STRING" ) );
                    
    buffer = new char[len+1];
                    
    strcpybuffergetenv"QUERY_STRING" ) );
            }

            
    // Terminieren
            
    buffer[len] = 0;

            
    // Kopiere Puffer in String
            
    string eingabe buffer;
            
    delete[] buffer;

            
    // Lokale Variablen zur Teilstring Suche
            
    size_t pos 0;
            
    size_t old_pos 0;

            
    // Lese Werte Paare
            
    while ( pos len ) {
                    
    pos eingabe.find"&"old_pos );
                    
    // Ein oder mehrer parameter wurden uebergeben ?
                    
    if ( pos == string::npos )
                            
    pos eingabe.length();

                    
    // Splitten
                    
    string paar eingabe.substrold_pospos-old_pos );
                    
    size_t eq_pos paar.find("=");

                    
    string schluessel paar.substr0eq_pos );
                    
    // Funktion zum Konvertieren von Leerzeichen( schluessel );

                    
    string wert paar.substreq_pos );
                    
    // Funktion zum Konvertieren von Leerzeichen( schluessel );

                    // Erstelle Liste
                    
    _liste.push_backschluesselwert );
                    
    old_pos pos 1;
            }

    }

    void AntworteListe_liste )
    {
            
    cout << "Content-Type: text/html" << endl;
            
    cout << endl;
            
    cout << "<html><title>C++ Beispiel CGI GET/POST Beispiel</title>" << endl;
            
    cout << "<head>" << endl;
            
    cout << "<body><h2>Ausgabe</h2>" << endl;

            
    ListElementtmp;
            for( 
    tmp _liste.front(); tmp != 0tmp tmp->naechstes ) {
                    
    cout << "<p><b>" << tmp->schluessel << "</b>" << tmp->wert << "</p>" << endl;
            }

            
    cout << "</body>" << endl;
            
    cout << "</head>" << endl;
            
    cout << "</html>" << endl;
    }


    int main()
    {
            
    Liste liste;

            if ( 
    Anfrageliste ) == false ) {
                    
    cout << "Content-Type: text/html" << endl;
                    
    cout << endl;
                    
    cout << "<html><title>C++ Beispiel CGI GET/POST Beispiel</title>" << endl;
                    
    cout << "</head><body>Keine Anfrage erhalten!" << endl;
                    
    cout << "</body>" << endl;
                    
    cout << "</head>" << endl;
                    
    cout << "</html>" << endl;
            } else
                    
    Antworteliste );

            return 
    EXIT_SUCCESS;

    In C++ hat man auch str.find(), etc.
    Code:
    int strcnt(const char* haystack, const char* needle)
    {
      std::string h(haystack);
      std::string n(needle);
      unsigned long plen = n.length();
      unsigned long f = 0;
      unsigned long found = 0;
      while((f = h.find(n,f)) != std::string::npos) {
        f = f + plen;
        found++;
      }
      return found;
    }
    Ich will aber mehr C lernen, darum will ich das in C machen.

    Gibts irgendwas was einen substring von Position 10 bis Position 20 z.B. holt? ich kenn nur das mit str[20]='\0';, aber ich brauch den string nicht von anfang an
    Geändert von Giuly (07-11-2005 um 15:23 Uhr)

  6. #6
    Registrierter Benutzer Avatar von Giuly
    Registriert seit
    28.04.2003
    Ort
    HB-Nord
    Beiträge
    201
    Das Problem lag garnicht bei der Funktion, die geht nun.

    Ich muss jetzt nurnoch aus einer Datei eine Zeile in ein char* einlesen. fscanf(FILE*, "%s\n%s", char*, char*); geht nicht, wie macht mans richtig?

    2xfgets und alles wird gut
    Geändert von Giuly (08-11-2005 um 02:03 Uhr)

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •