# Http post request



## Sg (29. Juli 2008)

Ich scheitere momentan an einem http post request an ein von mir selbst geschriebenes php-script. ;(

der PHP script sieht wie folgt aus



> <?php
> $daten=$_POST["daten"];
> $datei = fopen("logfile.txt","w");
> fwrite($datei, $daten);
> ?>



ich möchte mittels c++ und winsocks einen string daten an das script übergeben.


----------



## Sg (31. Juli 2008)

^^ niemand ?


----------



## Thomasio (31. Juli 2008)

Um das mit Winsocks zu lösen müsste der Server Sockets unterstützen UND du auch einen socketserver ins PHP script einbauen, einfacher gehts mit WinInet.

Ersetze domainurl, scripturl und stringtosend mit deinen Daten

Mit- linken musst du libwininet.a


```
#include <wininet.h>

HINTERNET inet = InternetOpen("MyAgent", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
         HINTERNET connection;
         HINTERNET request;
         unsigned long flags;
         unsigned long len;
         connection = InternetConnect(inet, TEXT(domainurl), INTERNET_DEFAULT_HTTP_PORT, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 1);
         flags = INTERNET_FLAG_PRAGMA_NOCACHE;
         request = HttpOpenRequest(connection, "POST", TEXT(scripturl), NULL, NULL, NULL, flags, 1);
         HttpSendRequest(request, "Content-Type: application/x-www-form-urlencoded", 47, (void*)stringtosend, strlen(stringtosend));
         std::stringstream CompleteBuffer;
         do{
             char antwortbuffer[10000];
             InternetReadFile(request, antwortbuffer, sizeof antwortbuffer, &len);
             antwortbuffer[len] = '\0';
             CompleteBuffer << antwortbuffer;
           } while(len);
         InternetCloseHandle(request);
         InternetCloseHandle(connection);
         InternetCloseHandle(inet);

MessageBox(NULL,CompleteBuffer.str().c_str(),"Server Antwort",MB_OK);
```


----------



## Rhox (25. August 2008)

Hallo alle zusammen...

Was bedeutet denn: "Mit- linken musst du libwininet.a"
Wie kann ich die Lib einbinden, damit er alles kennt? Hab ich die denn standardmäßig auf dem PC, oder muss ich die erst irgendwo runterladen!?


----------



## Rhox (25. August 2008)

Irgendwie hab ich das mit dem Linker geschafft...
(Borland Builder: 
Projekt -> Optionenquelle bearbeiten 
und dann bei 
<SPARELIBS value="[...] wininet.lib"/> hinten mit dazu geschrieben =)
)

Nur, falls das jemanden interessiert..

Thomasio, gehe ich richtig davon aus, dass die domainurl = "http//172.20.x.x/" sein muss und die scripturl z.B. = "CGI/Execute/" wäre?

Wenn ich an die Adresse "http//172.20.x.x/CGI/Execute/" Daten (stringtosend) senden will?!


----------



## Thomasio (26. August 2008)

Scripturl ist auf jeden Fall eine PHP Datei, also wenn überhaupt im CGI Verzeichnis, dann

CGI/Execute/scriptname.php

Domainurl beginnt nicht mit http, weil es ja ein HttpOpenRequest ist, und ended auch nicht mit /
Mal angenommen dein Script liegt auf

http://www.meinedomain.com/homepage/irgendwas/script.php

dann ist

domainurl = "www.meinedomain.com"
scripturl = "homepage/irgendwas/script.php"

und stringtosend sieht dann etwa so aus:

stringtosend = "daten1=1234&daten2=3456&daten3=abcde"


----------



## Rhox (26. August 2008)

Danke für die schnelle Antwort =)

Es war etwas schwierig bei mir, da ich kein Script anspreche... Sondern ein Cisco IP Phone. Und dem kann man Daten nach 172.30.x.x/CGI/Execute Daten zum anzeigen schicken. Ebenso war noch eine Authentifizierung nötig. Aber jetzt hat alles geklappt. 

Wichtig war die richtige Datenlänge.. Und nützlich war der Wireshark, um zu sehen, was wirklich gesendet wird... Besonders, da ich aus JavaScript es schon mal hinbekommen habe. So kann man die Protokolldaten genau vergleichen =)

Hier mal mein Code, falls jemand das Problem noch mal hat:

```
HINTERNET inet = InternetOpen("My App", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
                 if (inet != NULL)
                 {
                        HINTERNET connection    = NULL;
                        HINTERNET request       = NULL;
                        unsigned long flags     = INTERNET_FLAG_PRAGMA_NOCACHE;

                        connection = InternetConnect(   inet,
                                                        "172.30.x.x",
                                                        INTERNET_DEFAULT_HTTP_PORT,
                                                        UserName.c_str(), //String
                                                        Passwort.c_str(),  //String
                                                        INTERNET_SERVICE_HTTP,
                                                        0, 1);

                        if (connection != NULL)
                        {
                         const char* ContentType = "text/xml";
                         request = HttpOpenRequest(      connection,
                                                         "POST",
                                                         "/CGI/Execute", //Pfad
                                                         NULL,       //HTTP standard Version
                                                         NULL,      //keine Referenz
                                                         &ContentType,
                                                         flags,1);
                        }
                        if (request != NULL)                         {
                         Erg = HttpSendRequest( request,
                                                "Content-Type: application/x-www-form-urlencoded\0",
                                                -1L,
                                                POST_Text.c_str(),
                                                POST_Text.Length());
                        }

                        InternetCloseHandle(request);
                        InternetCloseHandle(connection);
                        InternetCloseHandle(inet);
}
```

Einbinden der Lib siehe oben.. (Borland C++ Builder)


Danke an dieser Stelle an alle, die geholfen haben! =)
Besonders an dich Thomasio


----------

