http Winsocket



  • Guten Abend zusammen,

    ich versuche momentan über Winsockets einen http POST request an eine Testseite von mir zu schicken. Leider funktioniert das ganze komischerweise nicht.
    Wenn das Formular von meiner Testpage ausgefüllt wird, werden diese Informationen in einer Textdatei gespeichert. Das ganze funktioniert auch wenn ich es manuell mache, jedoch funzt es leider nicht mit meinem Script.

    Hier mal das \1:

    #define _WINSOCK_DEPRECATED_NO_WARNINGS
    #define _CRT_SECURE_NO_WARNINGS
    #include <winsock2.h>
    #include <windows.h>
    #include <iostream>
    #include <ws2tcpip.h>
    
    #pragma comment(lib,"ws2_32.lib")
    
    using namespace std;
    
    int main(){
    	WSADATA wsaData;
    	if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
    		cout << "WSAStartup failed.\n";
    		system("pause");
    		return 1;
    	}
    	SOCKET Socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    	char hostip[12];
    	cin >> hostip;
    
    	SOCKADDR_IN SockAddr;
    	SockAddr.sin_port = htons(80);
    	SockAddr.sin_family = AF_INET;
    	SockAddr.sin_addr.s_addr = inet_addr(hostip);
    	cout << "Connecting...\n";
    	if (connect(Socket, (SOCKADDR*)(&SockAddr), sizeof(SockAddr)) != 0){
    		cout << "Could not connect";
    		system("pause");
    		return 1;
    	}
    	cout << "Connected.\n";
    	char argumente[] = "account=fdddabii&pass=lumpeeen&email=mamaistcnananool";
    	char sendpost[512];
    	_snprintf(sendpost, sizeof(sendpost), "POST /fabi.php HTTP/1.1\r\n"
    		"Host: 185.27.252.35\r\n"
    		"Content-Type: application/x-www-form-urlencoded\r\n"
    		"Content-Length: %d\r\n\r\n"
    		"%s", strlen(argumente), argumente);
    	send(Socket, sendpost, sizeof(sendpost), 0);
    	char buffer[10000];
    	int nDataLength;
    	while ((nDataLength = recv(Socket, buffer, 10000, 0)) > 0){
    		int i = 0;
    		while (buffer[i] >= 32 || buffer[i] == '\n' || buffer[i] == '\r') {
    			cout << buffer[i];
    			i += 1;
    		}
    	}
    	closesocket(Socket);
    	WSACleanup();
    	system("pause");
    	return 0;
    }
    

    Mfg



  • Du prüfst send nicht auf Fehler.
    Passt alles in 512 Byte? Warum nicht std::string?
    Du sendest immer 512 Byte. Kommt der Server damit klar? Warum nicht std::string?



  • Erstmal danke für die Hilfe.

    An dem Send kann es eig nicht liegen, da ich ne antwort vom server bekomme:

    http://i.epvpimg.com/jnjLc.png



  • Tja, funktioniert nicht ist halt ne sinnvolle Fehlerbeschreibung. Was ist denn das Problem, wenn du eine Antwort erhältst? Und was kommt am Server tatsächlich an?

    Irgendwie scheint mir das kein C++ Problem zu sein.



  • Also was tatsächlich am Server ankommt weiß ich leider nicht. Höchstwahrscheinlich das falsche, da meine Informationen nicht in der Textdatei abgespeichert werden.

    Mfg. danke für die hilfe



  • #include <vector>
    #include <string>
    #include <sstream>
    #include <iostream>
    
    #define _WINSOCK_DEPRECATED_NO_WARNINGS
    #include <winsock2.h>
    #include <ws2tcpip.h> 
    #pragma comment(lib,"ws2_32.lib") 
    
    int main()
    {
    	WSADATA wsa_data;
    	if( WSAStartup( MAKEWORD( 2, 2 ), &wsa_data ) != 0 ) {
    		std::cerr << "WSAStartup failed.\n";
    		return EXIT_FAILURE;
    	}
    
    	SOCKET s = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );
    	if( s == INVALID_SOCKET ) {
    		std::cerr << "Failed to create socket.\n";
    		WSACleanup();
    		return EXIT_FAILURE;
    	}
    
    	SOCKADDR_IN addr;
    	addr.sin_port = htons( 80 );
    	addr.sin_family = AF_INET;
    	char const * host_addr = "185.27.252.35";
    	addr.sin_addr.s_addr = inet_addr( host_addr );
    
    	if( connect( s, reinterpret_cast< SOCKADDR* >( &addr ), sizeof addr ) ) {
    		std::cerr << "Failed to connect.\n\n";
    		closesocket( s );
    		WSACleanup();
    		return EXIT_FAILURE;
    	}
    
    	std::cout << "Account:  ";
    	std::string acct; std::cin >> acct;
    	std::cout << "Password: ";
    	std::string pass; std::cin >> pass;
    	std::cout << "Mail:     ";
    	std::string mail; std::cin >> mail;
    
    	std::stringstream content;
    	content << "account=" << acct << "&pass=" << pass << "&email=" << mail << "&submit=registrieren";
    
    	// urlencode()n darfst selber
    
    	std::string send_buffer = std::string(
    		"POST /fabi.php HTTP/1.1\r\n"
    		"Host: ") + host_addr + "\r\n"
    		"Accept: text/html\r\n"
    		"Content-Type: application/x-www-form-urlencoded\r\n"
    		"Content-Length: " + std::to_string( content.str().length() ) + "\r\n\r\n" + content.str() + "\r\n";
    
    	if( send( s, send_buffer.data(), static_cast< int >( send_buffer.length() ), 0 ) == SOCKET_ERROR ) {
    		std::cerr << "Send failed.\n\n";
    		closesocket( s );
    		WSACleanup();
    		return EXIT_FAILURE;
    	}
    
    	int result;
    	std::vector< char > answer( 512 );
    	do {
    		if( ( result = recv( s, answer.data(), static_cast< int >( answer.size() ), 0 ) ) > 0 )
    			std::copy( std::begin( answer ), std::begin( answer ) + result, std::ostream_iterator< char >( std::cout ) );
    		else if( !result )
    			std::cout << "Connection closed.\n\n";
    		else
    			std::cerr << "Receive failed.\n\n";
    	} while( result > 0 );
    
    	if( shutdown( s, SD_BOTH ) == SOCKET_ERROR )
    		std::cerr << "Shutdown failed.\n\n";
    	closesocket( s );
    	WSACleanup();
    }
    

Anmelden zum Antworten