Http und c

Hallo Forum!

Ich möchte gerade einen kleinen Server, der auch html Seiten an einen Browser schicken kann, schreiben.

Dabei frage ich mich folgendes:

  1. Was muß an den Browser gesendet werden, wenn ich sicherstellen will, daß die Seite auch angezeigt wird? Langt ein einfaches "Content-type: text/html\r\n\r\n […] ", oder muß ich noch andere Sachen in den HTTP-Header stellen?

  2. _Muß_ ich erst auf den Request vom Client warten bis ich die Seite Losschicke, oder darf ich auch gleich nach accept() loslegen? (Muß ich da auch speziell was beachten, wenn die socket non-buffering ist?)

  3. Wie kann ich sichergestellen, daß der Client sein Request auch abgeschlossen hat? Momentan benutze ich noch was in der Art:

const int iBuffSize=512;
char pBuffer[iBuffSize];
int iBytes = iBuffSize;
while ( iBytes == iBuffSize ) {
iBytes = recv(iSock, pBuffer, iBuffSize, 0);
/* […] */ }

Ich denke mal, daß sowas nur in der localen loopback und LAN-Welt funktioniert.

  1. Wie soll ich reagieren, wenn recv -1 (bzw SOCKET_ERROR) oder 0 zurückgibt? Bedeutet 0 immer, daß die Verbindung vom Client zurückgesetzt wurde? Gibt es da Unterschiede zwischen Linux-Sockets und Winsock?

Fragen über Fragen …

Gruß,
Jo

  1. Was muß an den Browser gesendet werden, wenn ich
    sicherstellen will, daß die Seite auch angezeigt wird? Langt
    ein einfaches "Content-type: text/html\r\n\r\n
    […] ", oder muß ich noch andere Sachen in den
    HTTP-Header stellen?

Am Anfang fehlt der HTTP-Status „200 OK HTTP1/1\r\n“.
Sinnvoll wäre u.U. "Content-length: " mit der Angabe der zu
erwartenden Bytes, wenn du das vorab weißt.

  1. _Muß_ ich erst auf den Request vom Client warten bis ich
    die Seite Losschicke, oder darf ich auch gleich nach accept()
    loslegen?

Wäre natürlich sinnvoll, auf die Request zu warten.
Prinzipiell sollten verfrühte Daten jedoch entsprechend am Client gebuffert werden. Aber was, wenn der Client nur
eine HEAD-Request schickt? Dann solltest du den eigentlichen
Content eigentlich unterdrücken…

  1. Wie kann ich sichergestellen, daß der Client sein Request
    auch abgeschlossen hat? Momentan benutze ich noch was in der
    Art:

Bei einer normalen GET-Request ist diese zu Ende, sobald
der CLient „\r\n\r\n“ sendet.

Hagen