Daten an ein php-formular senden



  • Moin,

    Folgendes Problem:
    Ich habe einen Server auf dem eine php-datei liegt, die über POST Daten empfangen kann.

    Wie kann ich durch C++ diesem Formular Variablen aus meinem Programm übergeben ?
    Den POST-Befehl kann ich nicht in GET umschreiben, also kann auch nichts über die URL übergeben werden.

    Danke im Vorraus !

    Lusches



  • C++ kann nativ keine netzwerkzugriffe.

    du musst hier also klaeren auf welchem betriebssystem es laufen muss, und abhaengig davon dich fuer eine library fuer den netzwerkzugriff entscheiden. kann eine 3rdparty oder eine des betriebssystems sein.

    allerdings empfiehlt sich eine high-level-api die bereits HTTP kann, HTTP per rohen sockets zu implementieren geht, ist aber nicht sonderlich bequem und stabil.



  • loki1985 schrieb:

    du musst hier also klaeren auf welchem betriebssystem es laufen muss

    Nö muss er nicht, wenn er boost::asio verwendet 🙂



  • Das ganze sollte unter Windows laufen können.

    Thx
    Lusches



  • Boost::Asio ist immernoch Systemunabhängig :p



  • Hier mal ein hässliches, C-Artiges C++-Programm für Windows, es kann dir ja eine Vorlage sein:

    #include <iostream>
    #include <string>
    #include <windows.h>
    
    void end(int descriptor) {
    	closesocket(descriptor);
    	WSACleanup();
    	exit(0);
    }
    
    int main() {
    	WSADATA wsaData;
    	WORD wVersionRequested = MAKEWORD(2,2);
    	WSAStartup(wVersionRequested, &wsaData);
    	SOCKET descriptor = socket(AF_INET, SOCK_STREAM, 0);
    	if(descriptor == SOCKET_ERROR) {
    		std::cerr << "Fehler: Endpunkt ist invalide\nFehler-Code: " << WSAGetLastError();
    		end(descriptor);
    	}
    	std::cout << "Webserver-URL (Port 80): ";
    	std::string server;
    	std::cin >> server;
    
    	// Beispiel:
    	server = "www-cgi.uni-regensburg.de";
    
    	hostent* host = gethostbyname(server.c_str());
    	if(host == 0) {
    		std::cerr << "Fehler: Der Server " << server << " ist unbekannt.\nFehler-Code: " << WSAGetLastError();
    		end(descriptor);
    	}
    	sockaddr_in addr;
    	addr.sin_family = AF_INET;
    	addr.sin_port = htons(80);
    	memcpy(&addr.sin_addr, host->h_addr, host->h_length); 
    	std::cout << "Status: Verbinde mit " << server << ".\n";
    	if(connect(descriptor, reinterpret_cast<sockaddr*>(&addr), sizeof addr) == SOCKET_ERROR) {
    		std::cerr << "Fehler: Keine Verbindung mit " << server << " moeglich.\nFehler-Code: " << WSAGetLastError();
    		end(descriptor);
    	}
    	std::cout << "Status: Mit " << server << " verbunden.\n";
    
    	// POST-Request muss geändert werden
    	std::string http_request = "POST /~brf09510/cgi-bin/cgipost HTTP/1.1\r\n"
    							   "Host: www-cgi.uni-regensburg.de\r\n"
    							   "Content-Type: application/x-www-form-urlencoded\r\n"
    							   "Content-Length: 15\r\n\r\n"
    							   "text=CGIAusgabe";
    
    	if(send(descriptor, http_request.c_str(), http_request.length(), 0) == SOCKET_ERROR) {
    		std::cerr << "Fehler: Konnte die Anfrage an " << server << " nicht senden.\nFehler-Code: " << WSAGetLastError();
    		end(descriptor);
    	}
    	std::cout << "Status: Anfrage gesendet, warte auf Antwort...\n";
    	char buffer[2056];
    	memset(buffer, 0, 2056);
    	if(recv(descriptor, buffer, 2055, 0) == SOCKET_ERROR) {
    		std::cerr << "Fehler: Konnte keine Antwort von " << server << " empfangen.\nFehler-Code: " << WSAGetLastError();
    		end(descriptor);
    	}
    	std::cout << "Status: Antwort empfangen, Ausgabe erfolgt...\n\n\n"
    			  << buffer
    			  << std::endl;
    	std::cout << "Status: Verbindung zu " << server << " wird geschlossen.\n";
    	end(descriptor);
    }
    


  • Danke für die Antworten.
    Boost::Asio sieht mir ein bissjen zu kompliziert aus und das WINAPI ist mir dann doch lieber 🙂

    Wenn ich das Beispiel kompilieren will bekomme ich folgende Fehler:

    [Linker error] undefined reference to closesocket@4' [Linker error] undefined reference toWSACleanup@0'
    [Linker error] undefined reference to WSAStartup@8' [Linker error] undefined reference tosocket@12'
    [Linker error] undefined reference to WSAGetLastError@0' [Linker error] undefined reference togethostbyname@4'
    [Linker error] undefined reference to WSAGetLastError@0' [Linker error] undefined reference tohtons@4'
    [Linker error] undefined reference to connect@12' [Linker error] undefined reference toWSAGetLastError@0'
    [Linker error] undefined reference to send@16' [Linker error] undefined reference toWSAGetLastError@0'
    [Linker error] undefined reference to recv@16' [Linker error] undefined reference toWSAGetLastError@0'
    ld returned 1 exit status
    C:\Dev-Cpp\projekte\test\Makefile.win [Build Error] [Project3.exe] Error 1

    😕



  • Dev-C++ ist veraltet Alter...



  • Ja, schmeiß es übern Haufen. Hol die Visual Studio (Express) oder die neuen Beta-Versionen. Bei deinem Programm muss noch die Winsock 2-Library von Windows dazugelinkt werden. Bei VS heißt die ws2_32.lib, bei dir muss es irgendeine *.a-Datei sein. Siehe Google.



  • Kóyaánasqatsi schrieb:

    Boost::Asio ist immernoch Systemunabhängig :p

    orly? wie krieg ich dass dann auf meiner waschmaschine zum laufen?



  • libcurl ist auch plattformunabhängig und hierfür bestens geeignet.


Anmelden zum Antworten