2010-10-25 14 views
6

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 

+1

¿Qué tal RFC2616 http://tools.ietf.org/html/rfc2616#section-8.1? –

+0

¿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). –

+0

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

Respuesta

1

lo recomiendo agarrar la fuente para Apache y ver cómo lo manejan. No hay mucho sentido en el código psuedo cuando puedes ver cómo funciona realmente.

+0

Las grandes mentes piensan igual ? ;) – alex

+0

nuestras respuestas deben haber pasado en los tubos :) –

1

Quizás pueda mirar Apache's code para algunas pistas. Está escrito en C

Esperemos que alguien va a llegar y dar una respuesta más detallada :)

+0

Estoy tratando de evitar hacer esto tanto como sea posible. Empecé el otro día, pero filtrar cosas que no necesito saber en este momento de las cosas que necesito consumen mucho tiempo. – Wolftousen

2

Yo recomiendo mirar GNU libmicrohttpd. Se enfoca directamente en proporcionar un marco sobre el cual construir servidores HTTP 1.1. Es pequeño y admite mantener vivo con y sin enhebrar. (Personalmente lo uso sin enhebrar. También tiene varios modelos de subprocesamiento.)

Incluso si decide escribir su servidor web desde cero, le sugiero que consulte libmicrohttpd para obtener información sobre cómo funciona el protocolo, pero cómo la biblioteca modela "el flujo de trabajo" de un servidor web de una manera muy limpia. Creo que es un error imaginar que keep-alive implica enhebrar y creo que es un impedimento para entender keep-alive.

(En cuanto a los créditos Apaches como un servidor web, es bastante grande, y hay un montónallí no relacionados con los protocolos, sino más bien cosas como su sistema de plugins y así sucesivamente.)

+0

Gracias, lo investigaré después de que me levante hoy. – Wolftousen

Cuestiones relacionadas