httpS POST abfrage an websever schicken

Hallo,
ich versuche seit geraumer Zeit ein kleines Programm zu schreiben welches eine https POST Anfrage einen Webserver schickt und die antwort ausgibt (Console).

Ich habe es mit Libcurl versucht, aber leider mag die Lib mein system nicht uznd stürzt beim Cleanup ab.

Ich wollte daher versuchen die Windows (7) c++ standart funktionen zu benutzen. Nur leider habe ich bisher kein treffendes Beispiel dafür finden können.

Kann mir da ggf. Jemand weiterhelfen?

Gruß
S.

Hi,

Ich wollte daher versuchen die Windows (7) c++ standart
funktionen zu benutzen. Nur leider habe ich bisher kein
treffendes Beispiel dafür finden können.

lies mal z.B. unter

http://msdn.microsoft.com/de-de/library/ms740673(v=v…

zum Thema socket, wenn du denn alles manuell loesen programmieren moechtest.

Hier deren Beispiel fuer einen Client:
http://msdn.microsoft.com/de-de/library/bb530741(v=v…

Gruss
E.

Hallo,
danke für den link, nur leider finde ich keine beispiele für SSL dort.
da ich ja auch ein Passwort an den Server übermittle, sollte dies besser nicht ohne ssl erfolgen.

Hi,

danke für den link, nur leider finde ich keine beispiele für
SSL dort.

SSL unter Windows und Linux wird von OpenSSL zur Verfuegung gestellt, z.B.

http://www.openssl.org/related/binaries.html

Gruss
E.

Hallo,
ich habe versucht eine Lösung per Winhttp zu finden, aber leider funktioniert das SSL dort nicht, weil es nicht Kompeliert.

Ich habe auch schon google dazu befragt, konnte aber bisher nichts finden…

#include 
#include 
#include 
#include 

#include 

#pragma comment(lib, "winhttp.lib")

void main(){

 char y;

 DWORD dwSize = 0;
 DWORD dwDownloaded = 0;
 LPSTR pszOutBuffer;
 BOOL bResults = FALSE;
 HINTERNET hSession = NULL, 
 hConnect = NULL,
 hRequest = NULL;

 // Use WinHttpOpen to obtain a session handle.
 hSession = WinHttpOpen( L"WinHTTP Example/1.0", 
 WINHTTP\_ACCESS\_TYPE\_DEFAULT\_PROXY,
 WINHTTP\_NO\_PROXY\_NAME, 
 WINHTTP\_NO\_PROXY\_BYPASS, 0);

 // Specify an HTTP server.
 if (hSession)
 hConnect = WinHttpConnect( hSession, L"https://google.de",
 INTERNET\_DEFAULT\_HTTPS\_PORT, 0);

 // Create an HTTP request handle.
 if (hConnect)
 hRequest = WinHttpOpenRequest( hConnect, L"GET", NULL,
 NULL, WINHTTP\_NO\_REFERER, 
 WINHTTP\_DEFAULT\_ACCEPT\_TYPES, 
 WINHTTP\_FLAG\_SECURE);

 // Send a request.
 if (hRequest)
 bResults = WinHttpSendRequest( hRequest,
 WINHTTP\_NO\_ADDITIONAL\_HEADERS,
 0, WINHTTP\_NO\_REQUEST\_DATA, 0, 
 0, 0);

 if( !WinHttpReceiveResponse( hRequest, NULL ) )
 {
 if( GetLastError( ) == ERROR\_WINHTTP\_CLIENT\_AUTH\_CERT\_NEEDED )
 {
 //MY is the store the certificate is in.
 hMyStore = CertOpenSystemStore( 0, TEXT("MY") );
 if( hMyStore )
 {
 pCertContext = CertFindCertificateInStore( hMyStore,
 X509\_ASN\_ENCODING | PKCS\_7\_ASN\_ENCODING,
 0,
 CERT\_FIND\_SUBJECT\_STR,
 (LPVOID) szCertName, //Subject string in the certificate.
 NULL );
 if( pCertContext )
 {
 WinHttpSetOption( hRequest, 
 WINHTTP\_OPTION\_CLIENT\_CERT\_CONTEXT,
 (LPVOID) pCertContext, 
 sizeof(CERT\_CONTEXT) );
 CertFreeCertificateContext( pCertContext );
 }
 CertCloseStore( hMyStore, 0 );

 // NOTE: Application should now resend the request.
 }
 }
 }


 // End the request.
 if (bResults)
 bResults = WinHttpReceiveResponse( hRequest, NULL);


 // Keep checking for data until there is nothing left.
 if (bResults)
 do 
 {
 // Check for available data.
 dwSize = 0;
 if (!WinHttpQueryDataAvailable( hRequest, &dwSize))
 printf("Error %u in WinHttpQueryDataAvailable.\n", GetLastError());

 // Allocate space for the buffer.
 pszOutBuffer = new char[dwSize+1];
 if (!pszOutBuffer)
 {
 printf("Out of memory\n");
 dwSize=0;
 }
 else
 {
 // Read the Data.
 ZeroMemory(pszOutBuffer, dwSize+1);

 if (!WinHttpReadData( hRequest, (LPVOID)pszOutBuffer, 
 dwSize, &dwDownloaded))
 printf( "Error %u in WinHttpReadData.\n", GetLastError());
 else
 printf( "%s\n", pszOutBuffer);

 // Free the memory allocated to the buffer.
 delete [] pszOutBuffer;
 }

 } while (dwSize \> 0);


 // Report any errors.
 if (!bResults)
 printf("Error %d has occurred.\n", GetLastError());

 // Close any open handles.
 if (hRequest) WinHttpCloseHandle(hRequest);
 if (hConnect) WinHttpCloseHandle(hConnect);
 if (hSession) WinHttpCloseHandle(hSession);

 std::cin \>\> y;

Der mommentane Code.

Gruß
S.

Hallo Seb-Eisdrache !

Einen https-Verbindungsaufbau selbst zu programmieren ist nicht ganz trivial.
Vielleicht reicht dir aber auch ein Wrapper, da brauchst du nichts an deinem normalen Code für http-Anfragen zu ändern:
https://www.stunnel.org/index.html
Dein Programm weiss dann aber natürlich nicht mehr mit wem es wirklich kommuniziert da der Wrapper ja den Verbindungsaufbau und die Kommunikation erledigt.

mfg
Christof

versuch es doch einfach mit visual studio c++!!!