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



  • @flenders:

    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...


Anmelden zum Antworten