Estoy intentando escribir mi propio servidor http 1.1, solo por diversión y aprender más sobre HTTP, sockets y subprocesos.Programación del servidor HTTP
He tenido un buen comienzo, creo que con solo entregar páginas estáticas (usando c, que preferiría quedarme por el momento). Tengo una página de prueba que escribí hace un tiempo y entrego ~ 50 archivos en 124ms de acuerdo con Chrome, sin usar hilos o tomas keep-alive.
Me ha resultado muy difícil hacer funcionar el enhebrado/mantenimiento de la vida. Hay pocos o ningún recurso en la web (que pueda encontrar en mis horas de búsqueda de Google) que expliquen las conexiones de mantener vivo en detalle. Si alguien pudiera recomendar un buen libro sobre la programación del servidor HTTP, lo agradecería enormemente.
He hecho algo de enhebrado y programación de socket antes haciendo un simple programa de chat, así que tengo al menos algo de experiencia con él.
El problema que tengo es que cuando intento incorporar subprocesos, el navegador del cliente configura conexiones múltiples. En algún punto de la línea, el servidor se confunde y el cliente simplemente se sienta allí esperando respuestas y el servidor deja de hacer cualquier cosa. Envío el encabezado Connection: Keep-Alive, pero eso no cambia nada y cuando incorporo keep-alive y creo un bucle para recibir solicitudes en la función de subprocesos, se detiene hasta que se cierra la conexión.
Agradecería que alguien me diera algún pseudocódigo sobre cómo mantenerme vivo/enhebrado trabajando para que el cliente deje de crear conexiones múltiples a la vez.
Una breve descripción de lo que está pasando en:
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
¿Qué tal RFC2616 http://tools.ietf.org/html/rfc2616#section-8.1? –
¿Estás seguro de que se trata de un problema relacionado con el subprocesamiento? ¿También está configurando el encabezado Content-Length? Creo que es necesario para mantenerse con vida para trabajar (a menos que use fragmentación). –
Estoy usando el encabezado content-length también y está enviando el tamaño adecuado para cada mensaje. La única razón por la que digo que está relacionado con el hilo es que no tengo problemas hasta que empiece a usar hilos. Si intento implementar keep-alive sin hilos, solo lleva la página para siempre. – Wolftousen