0Pricing
C Academy · Lección

Cliente TCP

Conéctese y envíe datos

Cliente TCP es una lección gratuita de C Academy en CoddyKit. Esta es la lección 3 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 cliente TCP

Un cliente TCP se conecta a un servidor y después envía y recibe datos. Su ciclo de vida es más corto que el del servidor: crear un socket, conectarse, comunicarse y cerrar.

Paso 1: crear el socket

Al igual que el servidor, cree un socket de flujo para TCP sobre IPv4.

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

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

Paso 2: describir el servidor

Rellene un sockaddr_in con el puerto y la IP del servidor. Utilice inet_pton para convertir la cadena de IP con puntos al formato binario.

#include <arpa/inet.h>
#include <netinet/in.h>

int set_server(struct sockaddr_in *addr, const char *ip, unsigned short port) {
    addr->sin_family = AF_INET;
    addr->sin_port = htons(port);
    return inet_pton(AF_INET, ip, &addr->sin_addr); /* 1 on success */
}

Paso 3: conectarse

connect() realiza el protocolo de enlace TCP con el servidor. Si tiene éxito, el socket está listo para recibir datos; si falla, establece errno (por ejemplo, si se rechaza la conexión).

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

int do_connect(int fd, struct sockaddr_in *addr) {
    if (connect(fd, (struct sockaddr *)addr, sizeof *addr) < 0) {
        perror("connect"); return -1;
    }
    return 0;
}

No es necesario utilizar bind

Normalmente, los clientes omiten bind: el kernel asigna automáticamente un puerto de origen efímero durante connect. Solo debe asociar un cliente cuando necesite un puerto de origen específico.

Paso 4: enviar datos

Después de conectarse, escriba una solicitud con send. Repita la operación para asegurarse de enviar todo el búfer.

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

int send_all(int fd, const char *data) {
    size_t left = strlen(data);
    const char *p = data;
    while (left > 0) {
        ssize_t n = send(fd, p, left, 0);
        if (n <= 0) return -1;
        p += n; left -= (size_t)n;
    }
    return 0;
}

Paso 5: recibir la respuesta

Lea la respuesta del servidor con recv. Añada un terminador nulo antes de tratar el búfer como una cadena.

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

void read_reply(int fd) {
    char buf[512];
    ssize_t n = recv(fd, buf, sizeof buf - 1, 0);
    if (n > 0) { buf[n] = 0; printf("server said: %s\n", buf); }
    else if (n == 0) printf("server closed connection\n");
}

Leer hasta que se cierre la conexión

Una llamada a recv podría no devolver la respuesta completa. Repita la operación hasta que recv devuelva 0 (el extremo remoto cerró la conexión) para leer una respuesta completa que llega en varios fragmentos.

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

void drain(int fd) {
    char buf[256]; ssize_t n;
    while ((n = recv(fd, buf, sizeof buf, 0)) > 0)
        fwrite(buf, 1, (size_t)n, stdout);
}

Paso 6: cerrar

Llame a close(fd) para finalizar la conexión y liberar el descriptor. Esto envía un FIN de TCP para que el servidor sepa que el cliente ha terminado.

#include <unistd.h>

void finish(int fd) {
    close(fd);
}

Cierre parcial con shutdown

shutdown(fd, SHUT_WR) cierra únicamente la dirección de escritura, señalando el final de la solicitud mientras permite que el cliente siga leyendo la respuesta. Resulta útil para los protocolos de solicitud y respuesta.

Gestión de fallos de conexión

Errores comunes del cliente: ECONNREFUSED (no hay ningún servidor escuchando), ETIMEDOUT (host inaccesible) y EHOSTUNREACH. Compruebe siempre connect e informe claramente al usuario de los fallos.

Comprobación rápida

Compruebe su comprensión de los clientes TCP.

Resumen

Ha creado un cliente TCP.

  • socket y, después, connect a la sockaddr_in del servidor
  • No es necesario hacer bind; el kernel elige un puerto de origen
  • envíe la solicitud y reciba la respuesta (use un bucle para obtener todos los datos)
  • haga close o shutdown al terminar; gestione los fallos de connect

Preguntas frecuentes

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

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

Conéctese y envíe datos 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 3 de 4.

¿Cuánto tiempo toma la lección «Cliente 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