POST Request



  • www.klamm.de ist heir nur eine URL, die mir spontan einfiel, nicht das wer denkt ich möchte die faken - es soll zum Schluß ein Browser und veröffentlicht werden 🙂



  • kann sich jemand zu Wort melden, der mir schon geholfen hat? Die schienen ja Ahnung zu haben ...



  • das request kann ich nach der erzeugung so verschicken?
    send( sock, buffer, strlen( buffer), 0);



  • Zeig mal den ganzen Code, denn wenn das Programm nicht mehr reagiert, bleibt es irgendwo in einer Endlosschleife stecken oder es wartet auf die Beendigung einer Funktion. Um die genaue Ursache zu erkennen, muss man aber den Code sehen.



  • void connection(char *Url)
    {
        #ifdef _WIN32
        /* Initialisiere TCP für Windows ("winsock") */
        short wVersionRequested;
        WSADATA wsaData;
        wVersionRequested = MAKEWORD (1, 1);
        if (WSAStartup (wVersionRequested, &wsaData) != 0)
            mainscreen->Output->Lines->Add("Konnte winsocket nicht initialisieren.");
        else
            mainscreen->Output->Lines->Add("Socket erfolgreich initialisiert.");
        #endif
        /* Erzeuge das Socket */
        sock = socket( PF_INET, SOCK_STREAM, 0);
        if (sock < 0)
            mainscreen->Output->Lines->Add( "Konnte Socket nicht erstellen.");
        else
            mainscreen->Output->Lines->Add( "Socket erstellt.");
        /* Erzeuge die Socketadresse des Servers
         * Sie besteht aus Typ, IP-Adresse und Portnummer */
        memset( &server, 0, sizeof (server));
        if ((addr = inet_addr( Server )) != INADDR_NONE)
            /* SERVER ist eine numerische IP-Adresse */
            memcpy( (char *)&server.sin_addr, &addr, sizeof(addr));
        else
        {
            /* Wandle den Servernamen in eine IP-Adresse um */
            host_info = gethostbyname( Server );
            if (NULL == host_info)
                mainscreen->Output->Lines->Add("Unbekannter Server.");
            memcpy( (char *)&server.sin_addr, host_info->h_addr, host_info->h_length);
        }
    
        server.sin_family = AF_INET;
        server.sin_port = htons( HTTP_PORT );
    
        /* Baue die Verbindung zum Server auf */
        if ( connect( sock, (struct sockaddr*)&server, sizeof( server)) < 0)
            mainscreen->Output->Text=mainscreen->Output->Text+"Konnte keine Verbindung zu "+Server+" aufbauen. Er ist moeglicherweise momentan nicht erreichbar. Versuch es spaeter noch einmal.";
        else
        {
            mainscreen->Output->Text=mainscreen->Output->Text+"Verbindung zu Server aufgebaut: ";
            mainscreen->Output->Lines->Add("");
            mainscreen->Output->Text=mainscreen->Output->Text+Server;
            mainscreen->Output->Lines->Add("");
            mainscreen->Output->Text=mainscreen->Output->Text+"Verbinde zu Pfad: ";
            mainscreen->Output->Lines->Add("");
            mainscreen->Output->Text=mainscreen->Output->Text+Url;
            mainscreen->Output->Lines->Add("");
        }
        /* Erzeuge und sende den http POST request */
    //    sprintf( buffer, "POST %s HTTP/1.1\nHost: %s\n loginid=54009&passwd=heinrich2001\n", Url, Server);
        sprintf( buffer, "POST www.klamm.de/partner/start_login.php \nHTTP/1.0 \n Host:www.klamm.de \nContent-Length: 19 \nAccept-Language: de \nPragma: no-cache");
    
        send( sock, buffer, strlen( buffer), 0);
    
        /* Hole die Serverantwort und gib sie in Memo aus; geht nur, wenn im Programm das HTML Flag gesetzt ist */
        if (HTML==true)
        {
            do
            {
                count = recv( sock, buffer, sizeof(buffer), 0);
                mainscreen->Output->Lines->Add(buffer);
                parsestr(buffer);
            }
            while (count > 0);
        }
        else
        {
            do
            {
                count = recv( sock, buffer, sizeof(buffer), 0);
                mainscreen->Output->Lines->Add(buffer);
    //            parsestr(buffer);
            }
            while (count > 0);
        }
        /* Schließe Verbindung und Socket */
        // if ( ConnectionTrennen == true)
    //    closesocket( sock );
        sock = 0;
    }
    


  • Wenn das dein richtiges Passwort & Benutzername ist, würde ich das mal schnell wegmachen, bevor es ein anderer sieht.

    Mmmhhh, nicht registiert, am besten änderst du dein Passwort.

    Zum Problem: Das erzeugen des POST-Request sollte so sein:
    [cpp]
    char passwort[256]={"deinpasswort"};
    char benutzerid[256]={"benutzerid"};
    size=sprintf( buffer, "POST http://www.klamm.de/partner/start_login.php HTTP/1.0\nAccept-Language: de\nContent-Type: application/x-www-form-urlencoded\nPragma: no-cache\nHost: [url=http://www.klamm.de\nContent-Length]www.klamm.de\nContent-Length[/url]: %d\n\nloginid=%s&passwd=%s\r\n",16+strlen(benutzerid)+strlen(passwort), benutzerid, passwort);[/cpp]

    [ Dieser Beitrag wurde am 31.12.2002 um 14:45 Uhr von D@niel $chumann editiert. ]

    [ Dieser Beitrag wurde am 05.01.2003 um 22:55 Uhr von D@niel $chumann editiert. ]



  • Ich glaube in den Zeilen while (count > 0); liegt der Fehler!
    In der MSDN-Library steht nämlich:

    If no error occurs, recv returns the number of bytes received. If the connection has been gracefully closed, the return value is zero. Otherwise, a value of SOCKET_ERROR is returned, and a specific error code can be retrieved by calling WSAGetLastError.

    Die Error Codes sind aber auch größer 0 -> Endlosschleife!

    Mach mal die while-Schleife raus und bau int WSAGetLastError(void); ein, dann weißt du was schief gelaufen ist!

    [ Dieser Beitrag wurde am 29.12.2002 um 23:18 Uhr von flenders editiert. ]



  • Mmmmmhhhh, das könnte noch funktionieren, aber der Server wartet auf die Zeichenfolge \r\n, vorher sendet er gar nichts. Nach dem Timeout wird er natürlich die Verbindung trennen.



  • hab mir mal deinen code gekrallt und an den server gesendet:

    HTTP/1.1 400 Bad Request
    Date: Mon, 30 Dec 2002 20:17:49 GMT
    Server: Apache
    Connection: close
    Content-Type: text/html; charset=iso-8859-1
    
    <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
    <HTML><HEAD>
    <TITLE>400 Bad Request</TITLE>
    </HEAD><BODY>
    <H1>Bad Request</H1>
    Your browser sent a request that this server could not understand.<P>
    Invalid URI in request POST ******URL***** HTTP/1.0<P>
    <HR>
    <ADDRESS>Apache/1.3.26 Server at ***** Port 80</ADDRESS>
    </BODY></HTML>
    
    HTTP/1.1 400 Bad Request
    Date: Mon, 30 Dec 2002 20:17:49 GMT
    Server: Apache
    Connection: close
    Content-Type: text/html; charset=iso-8859-1
    

    hm...
    und die schleife hab ich auch rausgenommen



  • Ich hab das Beispiel geändert (das was gefehlt hat ist Fett). So funktioniert es, hab es auch ausprobiert.



  • hm, was hast du als ausgabe bekommen, bzw was genau hast du da getestet? ob du dich so einloggen könntest, oder ob eine verbindung aufgebaut wurde? code bitte 🙂



  • Ich hab erstmal das zum Server gesendet, das ich vorher geschrieben habe. Dann hab ich die gleiche Fehlermeldung vom Server bekommen, wie du auch. Also hab ich es auf das obige geändert und dann hat der Server mir eine ziemlich große Seite zurückgeliefert. Natürlich hab ich das nicht alles gelesen, weil ja auch noch die HTML-Tags drin stehen.
    Ich guck es mir nochmal im IE an.

    Wo genau liegt jetzt noch dein Problem?



  • nun, ich möchte einen webbrowser schreiben, mit dem ich mich bei verschiedenen seiten einloggen kann (zum verwalten).
    ich hab das mit den parametern jetzt auf mehreren seiten ausprobiert (hab die daten an das script geschickt, das in <form action=tatata.php> stand), allerdings wurde ich nie eingeloggt, d.h. ich hab keine neue seite bekommen 😞



  • war bei dem form method=post oder method=get?
    Weil bei get hängst du die Variablen einfach nur an deine URL tatata.php?user=meinname&pass=geheim



  • ich weiß, wäre es get wäre ich schon seit 2 monaten durch, aber es ist teilweise leider post 😞



  • funktioniert es denn bei manchen?
    schickst du auch wirklich alles formularfelder mit?
    was bekommst du denn zurück, wenn es nicht funktioniert?



  • ich schicke alles mit imho (es ist auch ein "hidden" formularfeld dabei)
    als ausgabe bekomme ich die loginseite wieder angezeigt
    funktionieren tuts nur bei get 😞



  • Vielleicht prüfen die den HTTP_REFERER, also od du auch von denen ihrer Seite kommst? 🙄
    Oder setzen die irgendwelche Cookies?



  • ehehe, cookies werden gesetzt, macht das einen unterschied?



  • Ich will den Fehler jetzt nicht auf dich schieben, aber du hast von Posting zu Posting immer mehr "Parameter", des POST-Requestes, den ich ziemlich am Anfang mal geschrieben habe, weggelassen. Braucht man nicht, hab ich mir auch gedacht. Hab sie aber bei mir immer verwendet, da sie der IE genau so schickt.

    Nach einem bisschen experimentieren:
    zu einem Ordnungsgemäßen Reqest gehört scheinbar das "Attribut" "Content-Type" hinzu.

    So kommt bei mir die Login-Seite mit der Meldung/Beschwerde über ein falsches Passwort:
    [cpp]
    char passwort[256]={"deinpasswort"};
    char benutzerid[256]={"benutzerid"};
    int len;
    len=sprintf( buffer, "POST http://www.klamm.de/partner/start_login.php HTTP/1.0\nAccept-Language: de\nContent-Type: application/x-www-form-urlencoded\nPragma: no-cache\nHost: [url=http://www.klamm.de\nContent-Length]www.klamm.de\nContent-Length[/url]: %d\n\nloginid=%s&passwd=%s\r\n",16+strlen(benutzerid)+strlen(passwort), benutzerid, passwort);
    send(Socket, buffer, len, 0);[/cpp]
    Mach das und es geht auch bei dir, versprochen 🙂


Anmelden zum Antworten