WebSocket es un potente protocolo de comunicación utilizado para el intercambio de datos bidireccional en tiempo real entre un cliente y un servidor. Su capacidad para establecer y mantener una conexión de larga duración lo hace ideal para aplicaciones que requieren actualizaciones de datos instantáneas. Si estás interesado en implementar WebSocket en lenguaje C, este artículo te proporcionará una guía concisa para empezar.
Instalación de libwebsockets
Actualmente, Tornado es una biblioteca popular para implementar WebSocket en Python. Sin embargo, libwebsockets es una biblioteca WebSocket multiplataforma flexible y fácil de usar escrita en lenguaje C.
libwebsockets es una biblioteca WebSocket multiplataforma escrita en C, que permite la creación de servidores y clientes relacionados con el protocolo WebSocket. Es una biblioteca flexible y fácil de usar que permite el desarrollo rápido de aplicaciones WebSocket de alto rendimiento. Gracias a su diseño simple y ligero, es particularmente adecuada para la creación de aplicaciones en sistemas integrados o aplicaciones de servidor de alta carga que manejan un gran número de conexiones.

Puedes instalar libwebsockets así:
git clone https://github.com/warmcat/libwebsockets.git
cd libwebsockets
mkdir build
cd build
cmake ..
make && sudo make install
pkg-config --modversion libwebsockets
Añadiendo libwebsockets.h
#include <libwebsockets.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
Escribiendo código de lógica
#include <libwebsockets.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
// Estructura para almacenar datos para cada sesión de WebSocket
struct per_session_data {
};
// Función de callback para mensajes del servidor WebSocket
int callback(struct lws *wsi, enum lws_callback_reasons reason, void *user, void *in, size_t len) {
switch (reason) {
case LWS_CALLBACK_ESTABLISHED: // Manejar el evento de nueva conexión
// Añadir un temporizador para enviar una marca de tiempo cada segundo
lws_callback_on_writable(wsi);
break;
case LWS_CALLBACK_SERVER_WRITEABLE: // Manejar el evento de envío de datos
// Enviar la marca de tiempo
time_t t = time(NULL);
char timestamp[20];
sprintf(timestamp, "%ld", t);
lws_write(wsi, timestamp, strlen(timestamp), LWS_WRITE_TEXT);
lws_callback_on_writable(wsi);
break;
// Otros eventos omitidos
}
return 0;
}
int main(int argc, char **argv) {
// Crear el protocolo WebSocket
static struct lws_protocols protocols[] = {
{
"demo-protocol", // Nombre del protocolo, debe coincidir con el protocolo WebSocket en el código frontend
callback, // Puntero a la función de callback
sizeof(struct per_session_data), // Tamaño de los datos para cada sesión (conexión)
0, // Sin parámetros de protocolo adicionales
NULL, NULL, NULL
},
{ NULL, NULL, 0, 0 } // La lista de protocolos termina con NULL
};
// Crear el contexto WebSocket
struct lws_context_creation_info info = {
.port = 3001, // Número de puerto de escucha
.protocols = protocols // Lista de protocolos
};
struct lws_context *context = lws_create_context(&info);
// Comprobar si la creación del contexto WebSocket fue exitosa
if (!context) {
printf("Failed to create WebSocket context.\n");
return -1;
}
// Entrar en el bucle y esperar las conexiones WebSocket
while (1) {
lws_service(context, 50);
}
// Limpiar y cerrar el contexto WebSocket
lws_context_destroy(context);
return 0;
}
La página Front-end Conectar WebSocket
Escribiendo página
Necesitas crear un index.html
, y rellenar el código de abajo:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script>
window.onload = () => {
if ('WebSocket' in window) {
// Crear una conexión WebSocket
let ws = new WebSocket('ws://127.0.0.1:3001/websocket');
// Enviar un mensaje cuando la conexión se establece correctamente, y el servidor puede empezar a enviar datos
ws.onopen = () => {
console.log('websocket success---');
ws.send('success');
}
ws.onmessage = (message) => {
let data = message.data;
console.log('get websocket message---', data);
}
ws.onerror = () => {
console.error('websocket fail');
}
} else {
console.error('dont support websocket');
};
};
</script>
</head>
<body>
</body>
</html>
Ejecutando la página
Haz clic con el botón derecho en index.html y abre este archivo:

Ver los resultados
Puedes ver que el back-end recibe primero el mensaje "open success" del front-end y la compilación abierta es exitosa.
Luego, después de que se ha establecido la conexión, el back-end ha estado enviando información para el front-end.

Cómo enviar WebSocket con Apidog
Ahora que hemos cubierto la implementación de WebSocket en lenguaje C, exploremos cómo enviar solicitudes WebSocket usando Apidog. Mientras que la sección anterior se centró en los fundamentos y las técnicas de la programación WebSocket en C, Apidog ofrece una forma conveniente de interactuar con las API de WebSocket a través de su interfaz fácil de usar.
Paso 1. Creación de la solicitud WebSocket
- Haz clic en el botón "+" y elige "Nueva API WebSocket". A continuación, especifica la URL de WebSocket, que normalmente empieza por
ws://
owss://
, en la configuración del punto final.

Paso 2. Enviar un mensaje
En Mensaje puedes rellenar el mensaje que se va a entregar al servidor, después de enviarlo, el servidor recibirá el mensaje que envíes.

Nota: Asegúrate de que el servidor WebSocket está en funcionamiento y es accesible para una comunicación exitosa con Apidog.
Paso 3. Guardar la solicitud
Cuando hayas terminado de escribir, puedes hacer clic en Guardar para guardar la solicitud, que se reutiliza rápidamente la próxima vez.

Paso 4. Conexión a un servidor WebSocket
Primero, haz clic en el botón Conectar para realizar una conexión WebSocket.

Después de una conexión exitosa, Apidog tiene un mensaje de éxito. El lado del servidor también responderá porque la conexión es exitosa.

Paso 5. Envío de la solicitud WebSocket
A continuación, podemos comunicarnos con el servidor a través de WebSocket. Puedes utilizar Apidog para enviar Mensaje y Parámetros al servidor haciendo clic en el botón Enviar.

Puedes hacer clic en el botón de desconexión si ya no deseas estar conectado.

Nota:
Apidog tiene tanto un lado web como un lado cliente. Si estás utilizando el lado web y quieres depurar los servicios locales, necesitas instalar el plugin de Google para Apidog.
Descarga aquí: Extensión del navegador Apidog
Conclusión
En conclusión, la implementación de WebSocket en lenguaje C implica la instalación de la biblioteca "libwebsockets", la inclusión del archivo de cabecera necesario y la escritura del código de lógica. Además, puedes utilizar herramientas como Apidog para enviar solicitudes WebSocket y probar tu funcionalidad WebSocket.