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 WebseiteDas Chrome ohne HTTP-Header überhaupt was anzeigt ist pures 'Glück'...