2010-10-25 11 views
6

Sto tentando di scrivere il mio server http 1.1, solo per divertimento e per saperne di più su HTTP, socket e threading.Programmazione server HTTP

Ho avuto una buona partenza penso con la sola consegna di pagine statiche (utilizzando c, che preferirei rimanere per il momento). Ho una pagina di prova che ho scritto un po 'di tempo fa e consegnare i suoi ~ 50 file in 124ms secondo chrome, senza usare thread o socket keep-alive.

Ho trovato molto difficile ottenere threading/keep-alive che funzionano affatto. Ci sono poche risorse sul web (che posso trovare nelle mie ore su Google) che spiegano in dettaglio le connessioni keep-alive. Se qualcuno potesse consigliare un buon libro sulla programmazione del server HTTP, lo apprezzerei molto.

Ho già fatto alcune programmazioni di threading e socket facendo un semplice programma di chat, quindi ho almeno un po 'di esperienza con esso.

Il problema che sto avendo è che quando tento di incorporare i thread, il browser client imposta più connessioni. Da qualche parte lungo la linea, il server si confonde e il client rimane seduto in attesa di risposte e il server smette di fare qualsiasi cosa. Invio l'intestazione Connection: Keep-Alive, ma questo non cambia nulla e quando incorporo keep-alive e creo un ciclo per ottenere richieste nella funzione threaded, si blocca fino a quando la connessione non viene chiusa.

Apprezzerei se qualcuno potesse darmi qualche pseudo codice su come mantenere in vita/threading di lavoro per questo in modo che il client smette di creare più connessioni alla volta.

Una breve descrizione di che cosa sta succedendo:

main function

load in static pages to large array of fileinfo struct that hold the file data and length 
create the socket 
set it to listen to port 80 
set it to listen for 10 connections at a time(i know this is low...) 
start an endless loop 
     block while waiting for someone to connect 
     check if it's a localhost connection 
      shutdown the server 
     otherwise 
      start a thread(with pthread), sending it the socket variable 
loop 


Thread Function

setsock opt for 3 sec timeout on send/recv and enable Keep-alive 
start endless loop 
    read in request 
    if request timed out, break the loop 
    Validate Request function call 
    Create Reponse function call 
    Send response 
    if request contained Connection: close header break the loop 
loop 
close socket 
return 

+1

Come su RFC2616 http://tools.ietf.org/html/rfc2616#section-8.1? –

+0

Sei sicuro che si tratti di un problema relativo al thread? Inoltre stai impostando l'intestazione Content-Length? Penso che sia necessario per mantenere vivo il lavoro (a meno che non si usi il chunking). –

+0

Sto anche utilizzando l'intestazione content-length e sta inviando la dimensione corretta per ogni messaggio. L'unica ragione per cui dico che è legata al thread è che non ho problemi fino a quando non uso i thread. Se provo a implementare keep-alive senza discussioni, la pagina deve sempre essere consegnata per sempre. – Wolftousen

risposta

1

mi consiglia di afferrare la fonte per Apache e vedere come gestire esso. Non c'è molto senso nel codice psuedo quando puoi vedere come funziona la cosa reale.

+0

Le grandi menti pensano allo stesso modo ? ;) – alex

+0

le nostre risposte devono essere passate nei tubi :) –

1

Forse potresti dare un'occhiata a Apache's code per alcuni indizi. E 'scritto in C.

Speriamo che qualcuno arriverà e dare una risposta più dettagliata :)

+0

Sto cercando di evitare di farlo il più possibile. Ho iniziato l'altro giorno, ma il filtraggio di cose che non ho bisogno di sapere al momento dalle cose di cui ho bisogno richiede molto tempo. – Wolftousen

2

mi raccomando guardando GNU libmicrohttpd. Si concentra direttamente sulla fornitura di un framework su cui costruire server HTTP 1.1. È piccolo e supporta keep-alive con e senza threading. (Personalmente lo uso senza threading. Ha anche diversi modelli di threading.)

Anche se decidi di scrivere il tuo server web da zero, ti suggerisco di guardare a libmicrohttpd per capire meglio come funziona il protocollo, ma come la biblioteca modella "il flusso di lavoro" di un server web in modo molto pulito. Penso che sia un errore immaginare che keep-alive implichi il threading e penso che sia un ostacolo alla comprensione keep-alive.

(A fronte dei crediti Apaches' come un server web, è abbastanza grande, e c'è un molto in là non relative a protocolli, ma piuttosto le cose come il suo sistema di plugin e così via.)

+0

Grazie, vedrò quello dopo che ho finito il lavoro oggi. – Wolftousen