Noticias Programación

Básico C – Zócalo del servidor

Página 1 de 3

Este extracto, de mi libro sobre programación C en un contexto de IoT, explica cómo usar sockets para crear un servidor web simple. Los servidores son más difíciles porque requieren programación asíncrona.


C fundamental: acercarse al coche

Ahora disponible como libro de tapa blanda y libro electrónico de Amazon.

Acerca de C
Extraer Empleado v Independiente
& Comportamiento indefinido Primeros pasos con C usando estructuras de control NetBeans y variables de datos
Extraer variables aritméticas y representación
Extraer operadores y expresiones aritméticas y de representación
Extracto: Expresiones
Extraer efectos secundarios, puntos de secuencia y evaluación perezosa
Primer borrador del capítulo: Alcance de las funciones de datos de bajo nivel y matrices de duración
Extraer arreglos simples
Extraer cadenas de enumeración
Extraer cadenas simples
Extraer: String I/O *** ¡NUEVO! Punteros
Extraer los punteros de inicio
Extraiga punteros, moldee y escriba Punning Structs
Extraer estructuras básicas
Extraer tipo de definición
Manipulación de bits
Extraer bits básicos
Extraer giros y rotaciones
Expediente
Extrae los archivos
Extraer archivos de acceso aleatorio

Compilación C: preprocesador, compilador, enlazador
Extracto de compilación y preprocesador



Ver también el volumen complementario: Aplicación de C

Anteriormente en este capítulo vimos el uso básico de sockect y cómo usarlos para crear un cliente de página web HTML. En este extracto, el tema se amplía al uso de sockets para implementar un servidor, lo cual es un poco más difícil debido a la necesidad de usar programación asíncrona.

En el capítulo pero no en este extracto.

Conceptos básicos de socket Funciones de socket Crear un socket Conectar un socket a una dirección Asociar un socket a una dirección Leer y escribir Escuchar y aceptar Un cliente web Un cliente web WinSock Conectarse a través de una URL

un servidor

Un servidor es más o menos lo mismo que un cliente desde el punto de vista de la implementación. La única diferencia real es que tiene que esperar a que un cliente se conecte antes de realizar una transacción.

El primer paso es crear el socket y sigue el mismo patrón que el cliente. Podríamos simplemente configurar las estructuras de direcciones y crear un socket, pero ahora que sabemos cómo usar getaddrinfo, es más fácil usarlo para hacer el trabajo de forma automática y flexible:

struct addrinfo sugerencias, * servidor; memset (& sugerencias, 0, tamaño de las sugerencias); sugerencias.ai_familia = AF_INET; sugerencias.ai_socktype = SOCK_STREAM; sugerencias.ai_flags = AI_PASSIVE; getaddrinfo (NULL, «1024», & consejos, & servidor);

El indicador AI_PASSIVE asigna la dirección IP del sistema actual. Puede obtener fácilmente estructuras de direcciones para direcciones alternativas como IPv6 usando esto, pero para simplificar solo solicitamos una dirección IPv4. Tenga en cuenta la especificación del puerto 1024, que no es el puerto HTTP habitual. La razón para usarlo es que los puertos por debajo de 1024 están limitados y los programas deben ejecutarse como root para usarlos. Si desea utilizar 80 para un socket de servidor HTTP, debe compilar el programa y ejecutarlo con Sudo o, de lo contrario, otorgar acceso de root al programa en el sistema operativo que está utilizando. Después de la llamada a getaddrinfo, las estructuras necesarias para crear los sockets están listas para usarse:

int sockfd = socket (servidor-> ai_family, servidor-> ai_socktype, servidor-> ai_protocol); bind (sockfd, servidor-> ai_addr, servidor-> ai_addrlen);
escuchar (sockfd, 10);

Puede ver cómo getaddrinfo hace que todo sea más fácil. La llamada vinculante asigna la dirección IP de la máquina en el puerto 1024 al socket y la escucha comienza con una cola de diez clientes esperando.

Ahora podemos usar accept para esperar a que un cliente se conecte:

estructura sockaddr_storage client_addr;
solen_t addr_size = tamaño de client_addr;
int client_fd = aceptar (sockfd,
(estructura sockaddr *) & client_addr,
& dirección_tamaño);

En este punto, nuestro programa está bloqueado esperando que un cliente se conecte al socket. Si desea seguir procesando cosas, debe usar un socket en modo sin bloqueo, consulte a continuación.

Por ahora, podemos suponer que cuando se acepta la devolución, hay un nuevo descriptor de socket en el cliente y detalles del cliente en client_addr. Nuevamente, para simplificar, no verificaremos quién es el cliente, sino que solo le brindaremos una página web. El cliente primero enviará un paquete HTTP GET al servidor, asumiendo que quiere obtener una página web. Podemos leer esto usando:

búfer de caracteres[2048]; int n = leer (client_fd, buffer, 2048); printf («% s», búfer);

Los datos en los encabezados GET le dicen al servidor qué archivo se requiere y puede realizar un manejo de cadenas para procesarlo y obtener el nombre. En este caso enviaremos el mismo archivo HTML independientemente de lo que solicite el cliente. Para hacer esto, necesitamos algunos encabezados HTTP que definan lo que estamos devolviendo y algo de HTML para definir la página que estamos enviando. El conjunto más simple de encabezados que funcionan es:

encabezados de fuente[] = «HTTP/1.0 200 OKrn Servidor: Crn
Tipo de contenido: texto / html r n r n «;

que corresponde al envío de:

HTTP / 1.0 200 Aceptar
Servidor: C
Tipo de contenido: texto / html

con una línea en blanco para marcar el final de los encabezados.

Tenga en cuenta que cambiamos a HTTP 1.0 porque es más simple y funciona con un conjunto más pequeño de encabezados. Si desea admitir HTTP 1.1, debe especificar el encabezado Content-Length y el encabezado Connection.

También puede gustarte...