Cómo implementar el servidor web del sitio web (como se muestra a continuación)
¿Cómo implementar WebServe del sitio web? Los servidores web pueden analizar (procesar) el protocolo HTTP. Cuando un servidor web recibe una solicitud HTTP, devuelve una respuesta HTTP, como una página HTML.
Temporizador
Si hay un retraso en el envío de datos después de que se establece la conexión, o la otra parte se queda sin energía repentinamente, ¿cómo se debe manejar la solicitud? Necesitamos implementar un temporizador para manejar las solicitudes de tiempo de espera. La implementación del temporizador de Vino se basa en el diseño de Nginx. Utiliza un árbol rojo-negro para almacenar eventos de tiempo y busca continuamente el evento más pequeño (temprano) del árbol cada vez que se produce el bucle de eventos. se activa un tiempo de espera. Para simplificar la implementación, implementé un pequeño montón superior en Vino para almacenar eventos cronometrados. Si el evento cronometrado que se procesa también admite conexiones largas, una vez procesada la solicitud, el temporizador correspondiente a la solicitud se actualizará, es decir, se volverá a cronometrar. Para códigos relacionados con el temporizador, consulte vn_event_timer.h y vn_event_timer.c.
HTTPParser
Debido a la incertidumbre de la red, no podemos garantizar que podamos leer todos los datos de la solicitud a la vez. Entonces, para cada solicitud abrimos un búfer para contener los datos leídos. Al mismo tiempo, debemos analizar los datos leídos al mismo tiempo para garantizar que los datos leídos sean datos razonables. Por ejemplo, suponiendo que los datos actuales en el búfer son GET/index.htmlHTT, el siguiente carácter leído debe ser. ser P; de lo contrario, la solicitud actual debe detectarse inmediatamente como una solicitud anormal y la conexión actual debe cerrarse activamente.
Según el análisis anterior, necesitamos implementar una máquina de estado HTTP (Parser) para mantener el estado de análisis actual. La implementación de la máquina de estado Vino se refiere al diseño de Nginx y simplifica la implementación de Nginx. . Para códigos relacionados con HTTPParser, consulte vn_http_parse.h y vn_http_parse.c
MemoryPool
Generalmente usamos malloc/calloc/free para asignar/liberar memoria, pero para algunos de larga duración. Programáticamente, estas funciones tienen algunas desventajas. El uso frecuente de estas funciones para asignar y liberar memoria puede causar fragmentación de la memoria y el sistema no puede recuperarla fácilmente y directamente. Un ejemplo típico es la asignación y desasignación frecuente de memoria para una gran concurrencia, lo que hará que la memoria del proceso se fragmente y el sistema no pueda recuperarla de inmediato.
El uso del grupo de memoria para asignar memoria elimina la necesidad de llamar a la función malloc/calloc cada vez, mejorando así la eficiencia de la asignación de memoria hasta cierto punto. Al mismo tiempo, el uso de grupos de memoria también puede simplificar la administración de la memoria. En Vino, Vino asigna uno o más grupos de memoria (cada grupo de memoria forma una lista vinculada) para cada solicitud y libera toda la memoria después de procesar la solicitud.
La implementación del grupo de memoria Vino todavía se basa en la implementación de Nginx y se ha simplificado. El código relacionado con MemoryPool se puede encontrar en vn_palloc.h y vn_palloc.c.
Otros
En el proceso de desarrollo de Vino, hay otros factores que deben ser considerados y sopesados. Al responder a una solicitud, si el usuario solicita un archivo muy grande, lo que hace que el búfer de escritura se llene, ¿cómo podemos diseñar mejor el búfer de respuesta? ¿Cómo diseñar estructuras de datos subyacentes (como cadenas, listas vinculadas, minimontones, etc.) de manera más eficiente? ¿Cómo analizar los argumentos de la línea de comando de manera más elegante? ¿Cómo manejar señales específicas? ¿Cómo manejar los mensajes de error de manera más sólida? Cuando la cantidad de código alcanza un cierto nivel, ¿cómo localizar el código anormal más rápido?
El trabajo de desarrollo y reconstrucción de Vino ha llegado a su fin por el momento y el código fuente se ha publicado en GitHub. Por supuesto, Vino deja mucho que desear, además de funciones aún por implementar.
Solo se admite el método HTTPGET y otros métodos HTTP no se admiten por el momento.
El procesamiento dinámico de solicitudes no es compatible por el momento.
Admite funcionalidad HTTP/1.1 limitada.
Las anteriores son todas las respuestas del editor sobre cómo implementar WebServe en un sitio web. WebServe del sitio web