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
Come su RFC2616 http://tools.ietf.org/html/rfc2616#section-8.1? –
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). –
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