004
08.05.2007, 13:31 Uhr
Tron
|
Moin,
hier mal ein Beispiel:
C++: |
/* Dateiname: httpget.c
Es wird ein GET request via http an einen Webserver gesendet und das Ergebnis auf der Konsole ausgegeben. */
//------------------------------------------------------------------------------ #include <stdio.h> #include <errno.h> #include <winsock2.h> #include <io.h> // write
// http requests werden normalerweise auf Port 80 // vom Server entgegengenommen #define HTTP_PORT 80
//------------------------------------------------------------------------------ int main( int argc, char **argv) { struct sockaddr_in server; struct hostent *host_info; unsigned long addr = 0; int sock = 0; char buffer[4096]; int count = 0; /** Die Windows Socket WSAStartup Funktion initialisiert die WS2_32.DLL für den Gebrauch durch einen Prozess. Das Makro MAKEWORD übergibt die Versionnummer der verwendeten Socketversion, wsa ist ein Pointer auf WSADATA wird hier nicht benötigt.
WSAStartup gibt bei einem Fehler einen Wert ungleich NULL zurück. Dieser Fehlercode kann mit WSAGetLastError abgefragt werden. */ WSADATA wsa; if(WSAStartup(MAKEWORD(2, 0),&wsa)!=0) { fprintf(stderr, "Fehler: %ld bei Initialisierung der Ws2_32.dll", WSAGetLastError()); // WSACleanup - Socket (WS2_32.dll) nach Gebrauch entfernen. WSACleanup(); return 1; } // ende if
// Parameter prüfen. if (argc != 3) { fprintf(stderr, "Nutze: httpget [Servername] [/Dateiname]\n"); WSACleanup(); // s.o. return 1; } // ende if
// Socket erzeugen. sock = socket(PF_INET, SOCK_STREAM, 0); if (sock < 0) { perror("Fehler beim anlegen des Socket"); closesocket(sock); WSACleanup(); // s.o. exit(1); } // ende if
// Socketadresse erzeugen // besteht aus Typ, IP-Adresse und Portnummer. // Setzt die ersten n Bytes von server auf den Wert 0. memset(&server, 0, sizeof (server)); // Konvertieren der als Argument übergeben Adresse des Servers. if ((addr = inet_addr( argv[1])) != INADDR_NONE) { // argv[1] ist eine numerische IP-Adresse. // kopiere den Inhalt von addr nach server.sin_addr. memcpy((char *)&server.sin_addr, &addr, sizeof(addr)); } // ende if else { // Servernamen nach IP-Adresse. host_info = gethostbyname(argv[1]); if (NULL == host_info) { fprintf(stderr, "Unbekannter Server: %s\n", argv[1]); closesocket(sock); WSACleanup(); // s.o. return 1; } // ende if // kopiere den inhalt von host_info->h_addr nach server.sin_addr. memcpy((char *)&server.sin_addr, host_info->h_addr, host_info->h_length); } // ende else // Protokol und Port. server.sin_family = AF_INET; server.sin_port = htons(HTTP_PORT);
// Baue die Verbindung zum Server auf. if (connect(sock, (struct sockaddr*)&server, sizeof( server)) != 0) { perror("Fehler beim verbinden mit Server"); closesocket(sock); WSACleanup(); // s.o. return 1; } // ende if
// Erzeuge und sende den http GET request. // RFC 2616 Hypertext Transfer Protocol -- HTTP/1.1
sprintf(buffer, "GET %s HTTP/1.1\nHost: %s\r\n\r\n", argv[2], argv[1]); send( sock, buffer, strlen( buffer), 0); // Hole die Serverantwort und gib sie auf der Konsole aus. while(count != SOCKET_ERROR ) { count = recv(sock, buffer, sizeof(buffer), 0); if (count == 0 ) { printf("Verbindung beendet.\n"); break; } // ende if // Ausgabe des HTML Headers und der angeforderten Seite. write(1, buffer, count); } // ende while if (count == SOCKET_ERROR ) { printf("Fehler: %ld beim Empfang!\n", WSAGetLastError()); } // ende if // Schließe Socket. closesocket(sock); // WSACleanup - Socket ( WS2_32.dll) nach Gebrauch entfernen. WSACleanup(); return 0; }
|
Gruß Tron |