POST Request



  • wie kann ich über die winsocket mittels POST an ein php-dokument parameter übergeben?





  • thx aber wirklich hats mir nicht geholfen 😞
    wo ist denn da der wesentliche teil mit dem post? (müssten doch nur ein, zwei zeilen sein, oder?)



  • Du sendest einfach den String an einen Proxy-Server (so ähnlich müsste es auch direkt zum Server gehen):

    *POST www.host.de
    Content-Length: 19
    Proxy-Connection: Keep-Alive

    Var1=4211&Var2=0815\r\n*

    Der php-Datei werden im Beispiel die Variablen Var1 und Var2 übergeben. Wichtig ist Content-Length und die beiden Zeilenumbrüche vor den Variablen und natürlich ein '\n' zwischen jeder Zeile!

    [ Dieser Beitrag wurde am 22.12.2002 um 19:09 Uhr von D@niel $chumann editiert. ]



  • ich mach das per get-request so momentan:

    sprintf( buffer, "POST %s HTTP/1.1\nHost: %s\n\n", Url, Server);
    

    das funktioniert, es werden nur keine parameter übergeben. wenn ich das so mache

    sprintf( buffer, "POST %s HTTP/1.0\n
        Accept-Language: de
        Content-Type: application/x-www-form-urlencoded
        Pragma: no-cache
        User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows 98)
        Host: www.klamm.de
        Content-Length: 19
        Proxy-Connection: Keep-Alive
        Var1=inhalt&Var2=wert\r\n, Url);
    

    dann stürzt das programm nach einer weile ab und reagiert nicht mehr 😞



  • 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 😞


Anmelden zum Antworten