Serverbefehle für Netzwerkprogrammierung
-
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