Código fuente de ejemplo del servidor Web TINY (consulte «Comprensión en profundidad de los sistemas informáticos (Segunda edición)»)
El autor implementó este programa de servidor Web TINY haciendo referencia al contenido de la Sección 11.6 de «Comprensión en profundidad de los sistemas informáticos (Segunda Edición)» (todas las descargas de código fuente están disponibles al final de este artículo). El código fuente proviene principalmente del código de referencia proporcionado por el libro y el autor realizó una pequeña cantidad de modificación para los problemas de depuración reales. El código se ha probado para lograr la función correspondiente. El entorno de prueba del autor es el siguiente:
Sistema operativo: CentOS 7
Compilador: g++ (GCC) 4.8.5 20150623 (Sombrero Rojo 4.8.5-11)
TINY es un servidor iterativo que ejecuta un bucle de servidor de bucle infinito típico, escuchando constantemente las solicitudes de conexión en el puerto pasado en la línea de comandos, procesando una transacción HTTP y cerrando el final que se conecta a ella.
Tenga en cuenta que TINY solo admite el método HTTP GET. Si el cliente solicita otros métodos (como POST), TINY le enviará un mensaje de error y volverá al programa principal. A continuación, el programa principal cierra la conexión y espera la siguiente solicitud de conexión. De lo contrario, lea y (como veremos) ignore los encabezados de solicitud.
A continuación se muestra cómo utilizar el programa y su efecto real:
En primer lugar, copie el código fuente en el sistema linux, introduzca el directorio minúsculo y compile el programa de origen:
g++ -o diminuto.c csapp.c -w -lpthread
La opción -w (minúsculas) se agrega para evitar mostrar advertencias (principalmente desde el código fuente proporcionado por el libro «Comprensión en profundidad de los sistemas informáticos»), -lpthread se debe a que el archivo csapp.c proporcionado por el libro contiene el uso de funciones de biblioteca de subprocesos POSIX.
A continuación, ejecute el programa diminuto compilado y especifique el número de puerto enlazado al servidor (como 8888):
./minúsculo 8888
Abra otro terminal de línea de comandos en esta máquina y utilice el comando telnet para conectarse al servidor:
telnet 127.0.0.1 8888
La siguiente información se muestra en el terminal, lo que indica que la conexión se realiza correctamente:
Probando 127.0.0.1…
Conectado a 127.0.0.1.
El personaje de escape es ‘^]’.
- Solicitar contenido estático
Introduzca la solicitud HTTP en el terminal:
OBTENER / HTTP
El comando anterior es una línea de solicitud, y su forma general es:
<method><uri><version>
Después de introducir la devolución del carro y la fuente de línea, introduzca una línea en blanco con retorno de carro para indicar la terminación de la lista de encabezados.
En este momento, el servidor devolverá la siguiente respuesta HTTP, incluida una línea de respuesta (HTTP/1.0 200 OK), seguida de cero o más encabezados de respuesta, seguido de una línea en blanco para terminar el encabezado, y finalmente seguido de un cuerpo de respuesta, aquí está el contenido del archivo home.html en la carpeta pequeña y, por último, el servidor cierra activamente la conexión:
HTTP/1.0 200 OK
Server: Tiny Web Server
Content-length: 248
Content-type: text/html
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>HomePage</title>
</head><body>
<h1>HomePage</h1>
<p>Welcome to our HomePage.<br />
</p>
<hr>
<address>Apache Server at ip-127-0-0-1 Port 2000</address>
</body></html>
Connection closed by foreign host.
2. Solicitar contenido dinámico
En primer lugar, debe compilar el programa adder.c en la carpeta del servidor cgi-add:
g++ adder.c -o adder
Adder pertenece a un programa CGI (Common Gateway Interface). Cuando un cliente solicita ejecutar un programa ejecutable correspondiente (como adder), pasa parámetros al programa a través de un URI (Uniform Resource Identifier). La salida generada por la ejecución del archivo ejecutable es el contenido dinámico. El programa de servidor ejecuta el programa CGI mediante la creación de un proceso secundario y devuelve su salida al cliente.
Para solicitar contenido dinámico, la solicitud del cliente es la siguiente:
GET /cgi-bin/adder?1500&213 HTTP
Del mismo modo, escriba una línea en blanco después del comando de terminar la lista de encabezados. Este comando significa solicitar el programa /cgi-bin/adder y pasar dos parámetros 1500 y 213.
La información devuelta por el servidor es la siguiente:
HTTP/1.0 200 OK
Server: Tiny Web Server
Content-length: 113
Content-type: text/html
Welcome to add.com: THE Internet addition portal.
<p>The answer is: 1500 + 213 = 1713
<p>Thanks for visiting!
Connection closed by foreign host.
Se puede ver que el servidor llamó adder, calculó y devolvió la suma de los dos parámetros y completó el cálculo de adición.
Para obtener el código fuente, haga clic en el siguiente enlace de GitHub:
Tiny web server Página de descarga de GitHub
.