HTTP Webserver in C - Problem mit IE



  • Hallo Leute ich hab einen kleinen Webserver in C geschrieben, jedoch hab ich jetzt einige Probleme mit den Browsern!

    Hier mal der Code:

    #include <stdio.h>
    #include <stdlib.h>
    #include <winsock.h>
    #include <winbase.h>
    #include <malloc.h>
    #define INDEX 0
    #define FRAMESET 1
    #define NAVIGATION 2
    #define STATUS 3
    #define SYSTEM 4
    #define AUSWERTUNG 5
    
    int main()
    {
        // Kompilierungsdetails
        printf("Details zur Kompilierung\n\n");
    	printf("Datum: %s\n", __DATE__);
    	printf("Zeit: %s\n", __TIME__);
    	printf("Zeile: %d\n", __LINE__);
    	printf("Datei: %s\n", __FILE__);
    
        //initialisieren der Variablen
        SOCKET   sock, passiveSock;
        struct sockaddr_in addr;
        int ret,i=0,dyn=1,length,test=0,fall=INDEX;
        char empfangen[1000];
    
        //Variable für lokales Passwort - dynamisch
        char *lokalespw;
        char *htmlsend;
    
        //Filepointer
        FILE* datopen;     // Beinhaltet das lokal gespeicherte Passwort
    
        //Starten des Sockets
        WSADATA WSAData;
        WSAStartup(MAKEWORD(2,3),&WSAData);
    
        passiveSock =   socket(AF_INET,            // verweist auf den TCP/IP Treiber
                        SOCK_STREAM,                    // Datenstrom orientierte verarbeitung
                        IPPROTO_TCP);                   // TCP/IP Protokoll ist zu verwenden
    
        addr.sin_addr.s_addr = INADDR_ANY;        // if you don’t care
        addr.sin_port = htons(80);              // convert port number from host to network order
    
        addr.sin_family = AF_INET;                // and third set the address family
    
        ret =   bind(passiveSock,
                (const struct sockaddr*) &addr,         // address or INADDR_ANY if you dont care see 10
                sizeof(addr));                         // length of parameter
    
        if (ret)
        {
            printf("bind not successful\n");
        }
        else
        {
            printf("bind successful\n");
        }
    
        // Einlesen des lokal gespeicherten Passwortes
        datopen= fopen("passwort.txt","r");
        if (datopen != NULL)
        {
            lokalespw = (char*) malloc (dyn*sizeof(char));
            do
            {
                fscanf (datopen, "%c", &lokalespw[i]);
                dyn++;
                lokalespw = (char*) realloc (lokalespw,dyn*sizeof(char));
                i++;
            }while (!feof(datopen));
            lokalespw[i-1]='\0';
            printf ("\n lokales pw: %s",lokalespw);
            fclose (datopen);
            dyn=1;
            i=0;
        }
    
        if (datopen == NULL)
        {
            printf ("Fehler beim öffnen des Passworts");
        }
    
        // Auf Port für Anfrage horchen
        ret=listen(passiveSock,1);
    
        // Unendliche Schleife für Kommunikation Webserver und Client
        for (;;)
        {
            // Annehmen der Anfrage
            length = sizeof(addr);
            sock =  accept(passiveSock,
                    (struct sockaddr*)&addr,
                    &length);
    
            switch (fall)
            {
                // Aufrufen des Indexes (Passwortabfrage)
                case INDEX:
                datopen = fopen("index.txt","r");
                if (datopen != NULL)
                {
                    htmlsend = (char*) malloc (dyn*sizeof(char));
                    do
                    {
                        htmlsend = (char*) realloc (htmlsend,dyn*sizeof(char));
                        fscanf (datopen, "%c", &htmlsend[i]);
                        i++;
                        dyn++;
                    }while (!feof(datopen));
                    fclose (datopen);
                    i=0;
                    dyn=1;
    
                    // Empfangen der Daten des Webclients
                    length = recv(sock,empfangen,sizeof(empfangen),0);
                    printf("%s\n",empfangen);
                    printf("%d\n",length);
    
                    // Senden des HTML Codes an den Webclient
                    if (test!=0)
                    {
                        send(sock,htmlsend,strlen(htmlsend),0);
                        test++;
                    }
                    fall=AUSWERTUNG;
                break;
    
                // HTML Seite für Frames
                case FRAMESET:
                break;
    
                // HTML Seite Navigation
                case NAVIGATION:
                break;
    
                // HTML Seite Status
                case STATUS:
                break;
    
                // HTML Seite System
                case SYSTEM:
                break;
    
                // Hier werden die Daten des Webserver ausgewertet
                case AUSWERTUNG:
                // Empfangen der Daten des Webclients
                length = recv(sock,empfangen,sizeof(empfangen),0);
                printf("%s\n",empfangen);
                printf("%d\n",length);
    
                datopen = fopen("clear.txt","r");
                if (datopen != NULL)
                {
                    htmlsend = (char*) malloc (dyn*sizeof(char));
                    do
                    {
                        htmlsend = (char*) realloc (htmlsend,dyn*sizeof(char));
                        fscanf (datopen, "%c", &htmlsend[i]);
                        i++;
                        dyn++;
                    }while (!feof(datopen));
                    fclose (datopen);
                }
                send(sock,htmlsend,strlen(htmlsend),0);
    
                break;
                }
            }
        }
    
    }
    

    Nun zu meinem Problem:
    Wenn ich mit dem IE auf den Server zugreifen möchte, bekommt der Server eine GET/ HTTP/1.1 Anfrage, danach schicke ich ihm auch den HTML Code, aber der IE bekommt gar nix bzw kann es nicht verwerten...
    Mit Google Chrome funktioniert das ohne Probleme, jedoch habe ich auch hier ein Problem. Die Seite Index ist ein Eingabefeld, jedoch schickt mit der Browser manchmal nur $w und sonst nichts. Manchmal schickt er aber auch das richtige passwort=Test
    Mal so mal so .. Was kann da sein? 😕

    Hier noch der HTML Code:

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    
    <head>
    <META http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
      <title>index.html</title>
    
    </head>
    
    <body>
    
    <form name="input" action="" method="post">
    Passwort:
    <input type="password" name="passwort" />
    <input type="submit" value="Submit" />
    </form>
    
    </body>
    
    </html>
    

    Vielen dank im voraus



  • #include <winsock.h>
    

    Was ist denn das?
    🙂



  • Dieser Thread wurde von Moderator/in rüdiger aus dem Forum ANSI C in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Sieht nach ziemlichem Gefrickel aus 😉
    - recv() muss evtl. mehrfach aufgerufen werden um die gesamten vom Client gesendeten Daten zu erhalten
    - Du wertest den HTTP-Header der Anfrage überhaupt nicht aus
    - Sendest du überhaupt selbst einen HTTP-Header?
    - Rückgabewert von send() wird nicht überprüft



  • Ich sehe in deinem Quellcode keine Hinweise darauf, dass du das HTTP-Protokoll überhaupt beachtest. Du liest nicht, was in der GET-Anfrage steht und sendest auch keine korrekte Antwort darauf. Es fehlt der gesamte Header.



  • Also also...
    Den Header werte ich nicht aus, weil das die Index seite ist, somit sollte es doch klar sein, dass wenn ein Browser eine Anfrage stellt, dass ich ihm einen HTML Text sende.

    Google Chrome hat auch kein Problem damit, aber IE spinnt rum.

    Die Daten die ich dem Browser bei der 1. Anfrage sende, sieht so aus:

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    
    <head>
    <META http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
      <title>index.html</title>
    
    </head>
    
    <body>
    
    <form name="input" action="" method="post">
    Passwort:
    <input type="password" name="passwort" />
    <input type="submit" value="Submit" />
    </form>
    
    </body>
    
    </html>
    

    Hmmn da steht doch oben der Header oder?
    Warum checkts der IE nicht?

    Grèètz





  • Geeky ich werd mit diesen HTTP Headern einfach nicht schlau.. =/...

    Der Server funktioniert mal so weit, also es geht jetzt mit IE und Google Chrome... Wieso weiß ich nicht... Habs nochmal neu programmiert und jetzt gehts.

    Wie sieht der zeitliche Aufbau der HTML Seite aus?

    Ich will dem Webclient jetzt Frames schicken. Ich les den HTML Text für das Frameset ein und schicks dem Client. Dann schick ich ihm den 1. Inhalt. Aber er zeigt die Frames nicht, sondern nur den Inhalt... =(...

    Kennt sich da jemand aus? 😉



  • Der Browser fragt normalerweise die Resource an, die er haben möchte

    GET /bla.html HTTP/1.1     // Geb mir bla.html via HTTP 1.1
    Host: www.example.org      // von www.example.org
    Connection: close          // wenn du mir bla.html geliefert hast mach die Verbindung zu
    

    daraufhin antwortet der Server z.B.:

    HTTP/1.1 200 OK                          // Jo, Datei vorhanden - Geb ich dir sofort
    Content-Type: text/html; charset=utf-8   // Du kriegst nun Daten vom Typ text/html kodiert als utf8
                                             // <-- Der HTTP-Header endet wenn eine leere Zeile übertragen wird, danach kommt der eigentl. Content
    <html>
    <head><title>bla...</title>
    ...
    

    Außerdem gibt es außer GET auch noch POST, HEAD, etc.
    Dann kann es außerdem passieren dass der Browser aufgrund von Caching etc. die von dir erwartete Reihenfolge nicht einhält.

    Wenn das kein Gefrickel werden soll, musst du:
    - Dir klar machen wie HTTP funktioniert (z.B. mit telnet rumspielen)
    - Den HTTP-Header den der Browser sendet auswerten
    - An den Browser zuerst einen passenden HTTP-Header senden und danach die eigentliche Webseite

    Das Chrome ohne HTTP-Header überhaupt was anzeigt ist pures 'Glück'...


Anmelden zum Antworten