0Pricing
C Academy · Lección

Servidor TCP

Acepte conexiones

Servidor TCP 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.

Construir un servidor TCP

Un servidor TCP espera a los clientes y acepta sus conexiones. Su ciclo de vida es: crear un socket, asociarlo a un puerto, esperar conexiones y después aceptarlas en un bucle.

Paso 1: crear el socket

Cree un socket de flujo para TCP sobre IPv4. Un resultado negativo indica un fallo.

#include <sys/socket.h>
#include <stdio.h>

int make_server_socket(void) {
    int fd = socket(AF_INET, SOCK_STREAM, 0);
    if (fd < 0) { perror("socket"); }
    return fd;
}

Paso 2: permitir la reutilización de direcciones

De forma predeterminada, un puerto permanece en TIME_WAIT después de que el servidor se detiene, lo que impide reiniciarlo. Establezca SO_REUSEADDR con setsockopt para poder volver a asociarlo inmediatamente.

#include <sys/socket.h>

void allow_reuse(int fd) {
    int yes = 1;
    setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof yes);
}

Paso 3: asociar a un puerto

bind() asocia el socket a una dirección y un puerto locales. INADDR_ANY escucha en todas las interfaces de red.

#include <sys/socket.h>
#include <netinet/in.h>
#include <stdio.h>

int bind_port(int fd, unsigned short port) {
    struct sockaddr_in addr = {0};
    addr.sin_family = AF_INET;
    addr.sin_addr.s_addr = INADDR_ANY;
    addr.sin_port = htons(port);
    if (bind(fd, (struct sockaddr *)&addr, sizeof addr) < 0) {
        perror("bind"); return -1;
    }
    return 0;
}

Paso 4: escuchar

listen() marca el socket como pasivo (listo para aceptar conexiones). El argumento backlog establece cuántas conexiones pendientes puede poner en cola el kernel.

#include <sys/socket.h>
#include <stdio.h>

int start_listen(int fd) {
    if (listen(fd, 16) < 0) { /* backlog of 16 */
        perror("listen"); return -1;
    }
    return 0;
}

Paso 5: aceptar conexiones

accept() se bloquea hasta que se conecta un cliente y después devuelve un socket nuevo para ese cliente. El socket original continúa escuchando.

#include <sys/socket.h>
#include <netinet/in.h>
#include <stdio.h>

int accept_one(int listen_fd) {
    struct sockaddr_in cli;
    socklen_t len = sizeof cli;
    int conn = accept(listen_fd, (struct sockaddr *)&cli, &len);
    if (conn < 0) perror("accept");
    return conn;
}

Dos sockets, dos funciones

Después de accept tiene dos sockets:

  • El socket de escucha continúa aceptando clientes nuevos
  • El socket de conexión se comunica con un cliente específico

Cierre el socket de conexión cuando termine con ese cliente.

Leer la solicitud

Utilice recv para leer los datos del cliente en un búfer. Un valor de retorno 0 significa que el cliente se desconectó; -1 indica un error.

#include <sys/socket.h>
#include <stdio.h>

void handle(int conn) {
    char buf[256];
    ssize_t n = recv(conn, buf, sizeof buf - 1, 0);
    if (n > 0) { buf[n] = 0; printf("got: %s\n", buf); }
}

Enviar una respuesta

Responda con send. Para datos grandes, repita la operación hasta enviar todos los bytes, ya que una sola llamada podría escribir solo parte del búfer.

#include <sys/socket.h>
#include <string.h>

void reply(int conn) {
    const char *msg = "hello from server\n";
    size_t left = strlen(msg);
    const char *p = msg;
    while (left > 0) {
        ssize_t n = send(conn, p, left, 0);
        if (n <= 0) break;
        p += n; left -= (size_t)n;
    }
}

El bucle de aceptación

Un servidor iterativo sencillo acepta un cliente, lo atiende, cierra la conexión y vuelve a aceptar el siguiente. Gestiona los clientes de uno en uno.

#include <unistd.h>

void serve_loop(int listen_fd, int (*accept_one)(int), void (*handle)(int)) {
    for (;;) {
        int conn = accept_one(listen_fd);
        if (conn < 0) continue;
        handle(conn);
        close(conn); /* done with this client */
    }
}

Apagado ordenado

Cierre el socket de escucha cuando el servidor se detenga y gestione SIGINT para salir del bucle de forma limpia. Cierre siempre los descriptores para liberar los recursos del kernel.

Comprobación rápida

Compruebe su comprensión de los servidores TCP.

Resumen

Ha construido un servidor TCP paso a paso.

  • socket, después SO_REUSEADDR, bind, listen y accept
  • accept devuelve un socket nuevo para cada cliente
  • recv/send para comunicarse y después close para cerrar la conexión
  • Utilice un bucle para atender a los clientes y compruebe cada valor devuelto

Preguntas frecuentes

¿La lección «Servidor TCP» es gratis?

Sí — el texto completo de «Servidor TCP» 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 «Servidor TCP»?

Acepte conexiones 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 «Servidor TCP»?

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. Introducción a los sockets
  2. Servidor TCP
  3. Cliente TCP
  4. Gestión de varios clientes
← Volver a C Academy