Server antwortet nicht auf HTTP Request



  • Ich habe einen kleinen Client in C++ gechrieben um etwas mit dem HTTP Protokoll und Servern herumzuspielen,aber leider bekomme ich keine anwort von den Servern,allerdings weiß ich nicht warum nicht.Ich habe den Client mit einem selbstprogrammierten Server getestet und da kamen meine Nachrichten immer an.
    Mein Code

    
    #define _WINSOCK_DEPRECATED_NO_WARNINGS
    #pragma comment (lib,"ws2_32.lib")
    #include <winsock2.h>
    #include<iostream>
    #include<windows.h>
    #include<iomanip>
    #include<sstream>
    
    using namespace std;
    
    int main(int argc, char*argv[]) {
    	cout << left;
    	int rc;
    	SOCKET Socket;
    	WSADATA wsaData;
    	char SBuf[1500] ;
    	char RBuf[1500];
    	sockaddr_in info;
    	char Eingabe[15];
    	short Port;
    
    	cout << setw(20) << "DLL starten:";
    	if (WSAStartup(MAKEWORD(2, 0), &wsaData) == 0)
    		cout << "Erfolgreich!";
    	else
    		cout << "Fehlgeschlagen!" << endl << "Fehercode:" << WSAGetLastError();
    	
    	
    	cout <<endl<<setw(20)<< "Socket erstellen:";
    	rc = Socket = socket(AF_INET, SOCK_STREAM, 0);
    	if (rc == INVALID_SOCKET)
    		cout << "Fehlgeschlagen!" << endl<<setw(20) << "Fehercode:" << WSAGetLastError();
    	else
    		cout << "Erfolgreich!";
    
    	cout <<endl<<endl<< "Ziel-IP-Adresse:";
    	cin.getline(Eingabe,15);
    
    	cout << "Ziel-Port:";
    	cin >> Port;
    	
    	info.sin_addr.s_addr = inet_addr(Eingabe);
    	info.sin_port = htons(Port);
    	info.sin_family = AF_INET;
    	
    	cout << endl << endl << setw(20) << "Verbinden:";
    	rc = connect(Socket, (sockaddr*)&info, sizeof(info));
    	if (rc == SOCKET_ERROR)
    		cout << "Fehlgeschlagen!" << endl << "Fehercode:" << WSAGetLastError();
    	else
    		cout << "Erfolgreich!";
    	
    	while (true) {
    		cin.ignore();
    		cout << endl << setw(20) << "Zusendende Daten:";
    		cin.getline(SBuf, 1500);
    
    		cout << endl << setw(20) << "Daten senden:";
    		rc = send(Socket, (char*)&SBuf, sizeof(SBuf), 0);
    		if (rc == SOCKET_ERROR)
    			cout << "Fehlgeschlagen!" << endl << "Fehercode:" << WSAGetLastError();
    		else
    			cout << "Erfolgreich!";
    
    		cout << endl << setw(20) << "Daten empfangen:";
    		rc = recv(Socket, (char*)&RBuf, sizeof(RBuf), 0);
    		if (rc == SOCKET_ERROR)
    			cout << "Fehlgeschlagen!" << endl << "Fehercode:" << WSAGetLastError();
    		else
    			cout << RBuf;
    
    	}
    	closesocket(Socket);
    	WSACleanup();
    
    	cin.get();
    	return 0;
    }
    
    ```cpp
    
    

    Dann habe ich Beispielsweise folgenden Befehl an den entsprechenden Server geschickt:

    GET /***/***.html HTTP/1.1\r\nHost: www.*********.de\r\n\r\n
    ```plain
    

    Ich hab es an verschiedenen Servern mit verschiedenen Befehlen versucht.
    Kann mir vieleciht jemand erklären was ich falsch gemacht habe?

    PS:es hat früher mit einem Vorgängerbereits schon einmal funktioniert.



  • Kann mir denn keiner helfen ?



  • bekommst du überhaupt keine Antwort?

    Die Antwort muss auch nicht an einem Stück gesendet/empfangen werden.
    Dafür können mehrere recv nötig sein.

    Das (char*)& bei SBuf und RBuf ist auch nicht nötig, da sie schon vom Typ char* sind.

    PS. Versuch mal die Verbindung mit putty im raw Modus aufzubauen.
    Oder nimm netcat



  • @Thorsten54 sagte in Server antwortet nicht auf HTTP Request:

    GET /***/***.html HTTP/1.1\r\nHost: www.*********.de\r\n\r\n

    Hast du das direkt so in dein Programm mit getline eingelesen?
    ("\r" ist dann nämlich einfach nur der String aus "\" und "r". Es wird da nichts auf magische Weise umgewndelt. 😉 )



  • @lagalopex Ja wie müsste ich es denn einlesen damit das klappt?😅



  • Wie wär's wenn du nur die URL einliest und den Rest des Requests dazubastelst!?



  • Dieser Beitrag wurde gelöscht!


  • @Swordfish das geht natürich aber geht das denn nicht mit einer normalen eingabe sonst müsste ich ja für jeden befehl ne eigene Behandlung machen



  • @Swordfish Hab mal die zusendenden Daten fest in den Sendebuffer als literal geschrieben hat jetzt auch funktioniert,hätte ich auch selbst drauf kommen können ,aber mal lernt nie aus.


Anmelden zum Antworten