0Pricing
C Academy · Aula

Cliente TCP

Conecte-se e envie dados.

Cliente TCP é uma aula grátis de C Academy no CoddyKit. Esta é a aula 3 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de C Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de C Academy inclui 4 aulas no total.

Criando um cliente TCP

Um cliente TCP conecta-se a um servidor e depois envia e recebe dados. Seu ciclo de vida é mais curto que o do servidor: criar um socket, conectar, comunicar-se e fechar.

Etapa 1: criar o socket

Assim como no servidor, crie um socket de fluxo 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;
}

Etapa 2: descrever o servidor

Preencha um sockaddr_in com a porta e o IP do servidor. Use inet_pton para converter a string de IP com pontos para a forma binária.

#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 */
}

Etapa 3: conectar

connect() realiza o handshake TCP com o servidor. Em caso de sucesso, o socket está pronto para receber dados; em caso de falha, define errno (por exemplo, quando a conexão é recusada).

#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;
}

Não é necessário usar bind

Os clientes geralmente não usam bind: o núcleo atribui automaticamente uma porta de origem efêmera durante connect. Use bind em um cliente somente quando precisar de uma porta de origem específica.

Etapa 4: enviar dados

Depois de conectar, escreva uma solicitação com send. Repita a operação para garantir que todo o buffer seja enviado.

#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;
}

Etapa 5: receber a resposta

Leia a resposta do servidor com recv. Adicione um terminador nulo antes de tratar o buffer como uma string.

#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");
}

Lendo até a conexão ser fechada

Uma chamada a recv pode não retornar a resposta completa. Repita a operação até que recv retorne 0 (o par encerrou a conexão) para ler uma resposta inteira que chega em partes.

#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);
}

Etapa 6: fechar

Chame close(fd) para encerrar a conexão e liberar o descritor. Isso envia um FIN TCP para que o servidor saiba que o cliente terminou.

#include <unistd.h>

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

Encerramento parcial com shutdown

shutdown(fd, SHUT_WR) fecha somente a direção de escrita, sinalizando o fim da solicitação e ainda permitindo que o cliente leia a resposta. Isso é útil para protocolos de solicitação e resposta.

Como lidar com falhas de conexão

Erros comuns do cliente: ECONNREFUSED (nenhum servidor está escutando), ETIMEDOUT (o host não pode ser alcançado) e EHOSTUNREACH. Verifique sempre connect e informe claramente as falhas ao usuário.

Verificação rápida

Teste sua compreensão sobre clientes TCP.

Recapitulação

Você criou um cliente TCP.

  • socket e, em seguida, connect ao sockaddr_in do servidor
  • Não é necessário usar bind; o kernel escolhe uma porta de origem
  • envie a solicitação e receba a resposta com recv (faça um loop para obter todos os dados)
  • use close ou shutdown ao terminar; trate as falhas de connect

Perguntas Frequentes

A aula “Cliente TCP” é grátis?

Sim — o texto completo de “Cliente TCP” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de C Academy, atualize para CoddyKit PRO. O curso de C Academy inclui 4 aulas no total.

O que vou aprender em “Cliente TCP”?

Conecte-se e envie dados. Você pratica C Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar C Academy?

Nenhuma experiência prévia é necessária. C Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 3 de 4.

Quanto tempo leva a aula “Cliente TCP”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de C Academy?

Sim. Cada aula de C Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. Visão geral dos sockets
  2. Servidor TCP
  3. Cliente TCP
  4. Lidando com vários clientes
← Voltar para C Academy