0Pricing
C++ Academy · Lección

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 back

Má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

  1. API de sockets BSD en C++
  2. Construcción de un servidor TCP de eco
  3. E/S asíncrona con epoll y kqueue
  4. Uso de Boost Asio para E/S asíncrona moderna
← Volver a C++ Academy