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