Construcción de un servidor TCP de eco
Recorra la implementación completa de un servidor TCP de eco.
Construcción de un servidor TCP de eco es una lección gratuita de C++ Academy en CoddyKit. Esta es la lección 2 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de C++ Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de C++ Academy incluye 4 lecciones en total.
Objetivo
Construya un servidor TCP mínimo que acepte una conexión, lea bytes y los escriba de vuelta. Es el "Hello World" de la programación de redes.
Estructura básica del servidor
El flujo del servidor es: crear el socket, enlazarlo, ponerlo a escuchar, aceptar la conexión y gestionarla. Repita el proceso indefinidamente.
int srv = socket(AF_INET, SOCK_STREAM, 0);
bind(srv, (sockaddr*)&addr, sizeof(addr));
listen(srv, 10);
while (true) {
int client = accept(srv, nullptr, nullptr);
handle(client);
close(client);
}Opción de reutilización de direcciones
Establezca SO_REUSEADDR para que el servidor pueda reiniciarse inmediatamente sin esperar a que el sistema operativo libere el puerto.
int yes = 1;
setsockopt(srv, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(yes));El bucle de eco
Lea los datos en un búfer y escriba de vuelta los mismos bytes. Deténgase cuando el cliente cierre la conexión.
void handle(int client) {
char buf[1024];
while (true) {
ssize_t n = recv(client, buf, sizeof(buf), 0);
if (n <= 0) break; // closed or error
send(client, buf, n, 0);
}
}Lecturas y escrituras parciales
Tanto recv como send pueden transferir menos bytes de los solicitados. En un protocolo basado en flujo, repita la operación en un bucle hasta terminar.
ssize_t total = 0;
while (total < n) {
ssize_t s = send(client, buf + total, n - total, 0);
if (s <= 0) break;
total += s;
}Gestión de varios clientes
El enfoque más sencillo es crear un subproceso por conexión. Funciona con cientos de clientes, pero presenta dificultades con miles.
while (true) {
int client = accept(srv, nullptr, nullptr);
std::thread([client]{ handle(client); close(client); }).detach();
}Una opción mejor: grupo de subprocesos
Crear un subproceso por conexión desperdicia recursos a gran escala. Un grupo fijo de subprocesos con una cola de trabajo escala mejor.
Cierre ordenado
Gestione SIGTERM/SIGINT para cerrar correctamente el socket de escucha. RAII también ayuda a garantizar que se cierren todos los sockets de los clientes.
Gestión de errores
Considere los errores como situaciones esperadas: los clientes se desconectan, las redes fallan temporalmente y se agotan los límites del sistema operativo. Registre el error y continúe; no bloquee el servidor por un cliente problemático.
Registro de cada cliente
Registre la dirección remota para facilitar la observabilidad.
sockaddr_in remote{};
socklen_t len = sizeof(remote);
int client = accept(srv, (sockaddr*)&remote, &len);
char ip[INET_ADDRSTRLEN];
inet_ntop(AF_INET, &remote.sin_addr, ip, sizeof(ip));
std::cout << "client " << ip << ":" << ntohs(remote.sin_port);Pruebas con netcat
Pruebe interactivamente el servidor de eco con nc.
nc 127.0.0.1 8080
hello
hello # echoed backMás allá del eco
A partir del eco puede ampliar el sistema para admitir:
- Protocolos basados en líneas (similares a HTTP)
- Protocolos binarios con tramas (con prefijo de longitud)
- Mensajes JSON o Protobuf
Comprobación rápida
¿Cuál es el propósito de la opción de socket SO_REUSEADDR?
Resumen
Un servidor TCP de eco mínimo utiliza socket, setsockopt con SO_REUSEADDR, bind, listen y accept en un bucle. Para admitir varios clientes, cree subprocesos o utilice un grupo de subprocesos. Para una escala elevada, cambie a E/S asíncrona (en la próxima lección).
Preguntas frecuentes
¿La lección «Construcción de un servidor TCP de eco» es gratis?
Sí — el texto completo de «Construcción de un servidor TCP de eco» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de C++ Academy, actualiza a CoddyKit PRO. El curso de C++ Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Construcción de un servidor TCP de eco»?
Recorra la implementación completa de un servidor TCP de eco. Practicas C++ Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar C++ Academy?
No se requiere experiencia previa. C++ Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 2 de 4.
¿Cuánto tiempo toma la lección «Construcción de un servidor TCP de eco»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de C++ Academy?
Sí. Cada lección de C++ Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- API de sockets BSD en C++
- Construcción de un servidor TCP de eco
- E/S asíncrona con epoll y kqueue
- Uso de Boost Asio para E/S asíncrona moderna