Webserver in c :IO Error: Premature end of Content-Length ?!?



  • Hallo,

    ich habe einen simplen Webserver in C geschrieben.
    Eigentlich klappt alles ganz gut. Über den Socket wird eine Verbindungsanfrage (Webbrowser) angenommen und mit dem "200" beantwortet und die eine HTML-Seite übertragen.
    Im Wireshark sieht meiner Meinung nach alles ganz gut aus.

    Allerdings wird z.B. Im Firefox die Seite heruntergeladen und angezeigt. Allerdings scheint Firefox noch auf irgendwas zu warten. Die Animation für den Seitenaufbau läuft noch zwei Sekunden weiter.

    Der HTML-Checker hat inzwischen am HTML-Code auch ncihts mehr zu meckern.
    Allerdings bekomme ich beim Online-HTML-Checker noch folgende Meldung:
    IO Error: Premature end of Content-Length delimited message body (expected: 8123; received: 8089)

    Allerdings ist der HTML-Code wirklich 8123 Byte groß. Habe auch schon manuell nachgezählt. Auch im Wireshark habe ich die Datenlängen zusammengezählt und komme auch auf 8123 Zeichen. Wenn ich "SourceCode anzeigen" anklicke wird auch der komplette HTML-Code dargestellt.

    Was mache ich falsch?

    In anderen Browsern wurde nur ein weisser Bildschirm angezeigt. Das Problem war dass ich nach senden der Daten sofort den Socket geschlossen habe. Jetzt ist ein kleine Wartezeit von 10 ms mit usleep() eingebaut und die Seiten werden dort auch angezeigt.

    Einige Webserver senden die Daten mit send() mein Webserver und andere mit write(). Eigentlich soll aber das selbe passieren solange man die Flags auf 0 setzt.

    Hat jemand eine Idee was dort schief läuft?



  • Sieht so aus, als ob du in das html content-length Feld 8123 rein schreibst, aber nur ein Packet der Länge 8089 verschickst.



  • OK Fehler gefunden. Aber finde den Fehler nicht 😉

    In dieser Schleife ist ctrlLength pro Durchlauf 2 Zeichen zu groß:

    int ctrlCount = 0;
    for (loop = 0; loop < MAX_DRIVES; loop ++) {
      if ((drive[loop].id != -1) && (drive[loop].name[0] != 0)) {
        strcpy(ctrlBuff[ctrlCount], "<form action=\"http://192.168.54.321:8088/Control\" method=\"get\">\r\n");
        sprintf(ctrlTmpStr, "<input type=\"hidden\" name=\"id\" value=\"%d\">\r\n", loop);
        strcat(ctrlBuff[ctrlCount], ctrlTmpStr);
        strcat(ctrlBuff[ctrlCount], "<button type=\"submit\" name=\"cmd\" value=\"1\">&uArr;</button>\r\n");
        strcat(ctrlBuff[ctrlCount], "<button type=\"submit\" name=\"cmd\" value=\"0\">&#9632;</button>\r\n");
        strcat(ctrlBuff[ctrlCount], "<button type=\"submit\" name=\"cmd\" value=\"2\">&dArr;</button>\r\n");
        strcat(ctrlBuff[ctrlCount], "<button type=\"submit\" name=\"cmd\" value=\"3\">1</button>\r\n");
        strcat(ctrlBuff[ctrlCount], "<button type=\"submit\" name=\"cmd\" value=\"4\">2</button>\r\n");
        sprintf(ctrlTmpStr, "&nbsp;%3d%% &nbsp; %s\r\n", (int)(( drive[loop].actualPos / 655.35)+0.5), drive[loop].name);
        strcat(ctrlBuff[ctrlCount], ctrlTmpStr);
        strcat(ctrlBuff[ctrlCount], "</form>\r\n");
        ctrlLength += strlen(ctrlBuff[ctrlCount]);
        ctrlCount ++;
      }
    }
    


  • Das ist die zugehörige Schleife um die Daten über den Soket zu senden:

            for (loop = 0; loop < ctrlCount; loop ++) {
              writtenBytes += (write(newSocket, ctrlBuff[loop], (strlen(ctrlBuff[loop]))));
            }
    
    

    Seltsamerweise kommt bei writtenBytes am Ende auch ein Byte zuviel heraus.



  • Vielleicht eine blöde Frage, aber wie hast du die Variablen jeweils initialisiert? Setzt du die vor den Schleifen jeweils auf 0?

    Sonst bitte ein Beispiel, dass man Kompilieren und ausprobieren kann, das macht es einfacher zu helfen.



  • Danke,
    Fehler gefunden. Habe nochmal alles stark vereinfacht und im online compiler getestet.

    Der Fehler war unter anderem dass eine Zeile vom html-header mitgezählt wurde.