Serverbefehle für Netzwerkprogrammierung



  • 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