Serverbefehle für Netzwerkprogrammierung



  • Jo, also ich hab letztens einen HTP-Client geschrieben.
    Funktioniert auch so weit ganz gut.
    Nur mein Problem ist, der kontaktierte Server kann mit dem Befehl, den ich ihm schicke nix anfangen.
    Deshalb wollte ich mal wissen, was es da alles so für Befehle gibt, die man einem Server schicken kann.



  • was haste denn geschickt?
    schonmal die rfc für das HTTP-Protokoll angeschaut?



  • Steht in der Protokollbeschreibung. Meistens zu finden auf http://www.ietf.org/rfc.html



  • Naja, also das Programm startet mit 2 Parametern hintendran.
    Einer ist die Serveradresse und der andere steht für eine Datei.
    Mein Prog generiert daraus einen GET-Befehl und schickt ihn den Server.
    Also, das is jetzt die C-Sorce von meinem Prog:

    #include "cpp_wg_network.h"
    
    int main(int argc, char **argv)
    {
    	int sock;
    	struct sockaddr_in host_addr;
    	struct hostent *hostinfo;
    	char *host, *file;
    	char command[1024];
    	char buf[1024];
    	unsigned int bytes_sent, bytes_recv;
    
    	/* Wurde das Prog korrekt aufgerufen? */
    	if (argc != 3) {
    		fprintf(stderr, "Aufruf: httprecv host file\n");
    		exit(EXIT_FAILURE);
    	}
    
    	host = argv[1];
    	file = argv[2];
    
    	// Sockets initialisieren
    	Init_Sockets();
    
    	/* Socket erzeugen */
    	sock = Open_Socket();
    
    	/* Adresse das Servers festlegen */
    	memset(&host_addr, 0, sizeof(host_addr));
    	host_addr.sin_family = AF_INET;
    	host_addr.sin_port = htons(HTTP_PORT);
    
    	host_addr.sin_addr.s_addr = inet_addr(host);
    	if (host_addr.sin_addr.s_addr == INADDR_NONE) {
    		/* Server wurde nicht mit IP sondern mit dem Namen angegeben */
    		hostinfo = gethostbyname(host);
    		if (hostinfo == NULL) {
    			perror("gethostbyname()");
    			exit(EXIT_FAILURE);
    		}
    		memcpy((char*) &host_addr.sin_addr.s_addr, hostinfo->h_addr, hostinfo->h_length);
    	}
    
    	/* Verbindung aufbauen */
    	if (connect(sock, (struct sockaddr*) &host_addr, sizeof(struct sockaddr)) == -1) {
    		perror("connect()");
    		exit(EXIT_FAILURE);
    	}
    
    	/* HTTP-GET-Befehl erzeugen */
    	sprintf(command, "GET %s HTTP/1.0\nHost: %s\n\n", file, host);
    
    	/* Befehl senden */
    	bytes_sent = send(sock, command, strlen(command), 0);
    	if (bytes_sent == -1) {
    		perror("send()");
    		exit(EXIT_FAILURE);
    	}
    
    	/* Antwort des Servers empfangen und ausgeben */
    	while ((bytes_recv = recv(sock, buf, sizeof(buf), 0)) > 0) {
    		write(1,buf,bytes_recv);
    	}
    	if (bytes_recv == -1) {
    		perror("recv()");
    		exit(EXIT_FAILURE);
    	}
    
    	Close_Socket(sock);
    	Close_Sockets();
    
    	return 0;
    }
    

    Und das ist die dazugehörige Header:

    #ifdef __cplusplus
    extern "C" {
    #endif
    
    #ifdef __cplusplus
    #include <cstdio>
    #include <cerrno>
    #include <cstring>
    #else
    #include <stdio.h>
    #include <errno.h>
    #include <string.h>
    #endif
    
    #ifdef _WIN32
    #include <winsock.h>
    #include <io.h>
    #else
    #include <sys/socket.h>
    #include <sys/types.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <netdb.h>
    #include <unistd.h>
    #endif
    
    #define HTTP_PORT 80
    
    void Init_Sockets(void)
    {
    	#ifdef _WIN32
    	WSADATA wsaData;
    	if (WSAStartup(MAKEWORD(1, 1), &wsaData) != 0) {
    		fprintf(stderr, "WSAStartup(): Kann Winsock nicht initialisieren.\n");
    		exit(EXIT_FAILURE);
    	}
    	#endif
    	return;
    }
    
    void Close_Sockets(void)
    {
    	#ifdef _WIN32
    	WSACleanup();
    	#endif
    	return;
    }
    
    void Close_Socket(int sock)
    {
    	#ifdef _WIN32
    	closesocket(sock);
    	#else
    	close(sock);
    	#endif
    	return;
    }
    
    int Open_Socket(void)
    {
        int sock;
        sock = socket(AF_INET, SOCK_STREAM, 0);
    	if (sock == -1) {
    		perror("socket()");
    		exit(EXIT_FAILURE);
    	}
    	return sock;
    }
    
    #ifdef __cplusplus
    }
    #endif
    

    Dann muss man unter Windoof noch die Lib für Winsockets einbinden.



  • ok



  • Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum Rund um die Programmierung verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • \r\n anstelle von \n

    Ansonsten würde ich HTTP 1.1 benutzen, da 1.0 mittlerweile deutlich veraltet ist und sich einige Server schwer tun könnten.



  • thx, aber was macht \r ? 😕



  • es macht nichts. es wird nur verlangt.





  • thx, das hilft mir schonmal, aber jetzt bin ich immer noch auf der Suche nach anderen Befehlen außer GET. Also, wenn mir da auch jemand helfen könnte, wär das nich schlecht.



  • hier steht alles: http://www.ietf.org/rfc/rfc2616.txt

    viel spaß



  • thx


Anmelden zum Antworten