Was ist eine shtml-Datei?
-
Hallo,
was genau ist eine .shtml-Datei und wie kann ich die anfordern? Wenn ich es mittels HTTP-GET versuche, bekomme ich immer nur die index.html.
Danke im voraus...
-
Eigentlich sollte es da keine Besonderheiten geben - zeig mal deinen Code...
-
Hallo flenders,
hier der Code. Den hatte ich aus einem Tutorial entnommen. Wie gesagt, es funktioniert, aber ich bekomme immer nur die index.html.
#include <stdio.h> #include <errno.h> #include <string> #include <winsock.h> #include <io.h> #define HTTP_PORT 80 TCHAR host[] = "host.name.de"; TCHAR file[] = "status.shtml"; COORD coord = { 80, 160 }; int main() { int sock; struct sockaddr_in host_addr; struct hostent *hostinfo; char command[1024]; char buf[1024]; unsigned int bytes_sent, bytes_recv; SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE), coord); /* ggf. Winsock initialisieren */ WSADATA wsaData; if (WSAStartup (MAKEWORD(1, 1), &wsaData) != 0) { fprintf (stderr, "WSAStartup(): Kann Winsock nicht initialisieren.\n"); exit (EXIT_FAILURE); } /* Socket erzeugen */ sock = socket (AF_INET, SOCK_STREAM, 0); if (sock == -1) { perror ("socket()"); exit (EXIT_FAILURE); } /* Adresse des 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); } printf ("\n"); closesocket(sock); WSACleanup(); return 0; }
-
Setzte mal vor den Dateinamen noch einen Slash - auwßerdem gehört das nicht hier hin -> verschoben nach WinAPI
-
Herzlichen Dank, das war die Lösung. Könntest Du bitte noch erklären, was das Slash nun ändert?
-
Du musst eben wenn du ein Dokument anforderst den Pfad beginnend mit / übermitteln

Ohne Slash erkennt der Server offenbar nicht, was du haben willst und schickt dir das Standard-(Fehler-404?)-Dokument
-
/ ist das Root-Dir deines Benutzernamens (höher kommste nicht) (auf dem Server)
./ ist das Verzeichnis in dem du dich gerade befindest (wo auf dem Server)
../ ist das Verzeichnis über deinem aktuellen "Standpunkt"scheinbar bist du mit deinem connect nicht im richtigen Verzeichnis gelandet.
mfg
tobi
-
wird für ein GET Request nicht immer der komplette Pfad verwendet? Ich würde denken, dass das ./ bzw. ../ oder einfach nur der Dateiname vom Browser einfach anhand des Pfades der aktuellen Datei ausgewertet wird, denn der Server weiß ja nichts davon, auf welcher Ebene ich mich befinde...