0Pricing
C Academy · Lezione

Client TCP

Connettersi e inviare dati

Client TCP è una lezione C Academy gratuita su CoddyKit. Questa è la lezione 3 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento C Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso C Academy include 4 lezioni in totale.

Creare un client TCP

Un client TCP si connette a un server, quindi invia e riceve dati. Il suo ciclo di vita è più breve di quello del server: creare un socket, connettersi, comunicare e chiudere.

Passaggio 1: creare il socket

Come per il server, crei un socket di tipo stream per TCP su 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;
}

Passaggio 2: descrivere il server

Compili un sockaddr_in con la porta e l'IP del server. Usi inet_pton per convertire la stringa IP con notazione puntata nella forma binaria.

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

Passaggio 3: connettersi

connect() esegue l'handshake TCP con il server. In caso di successo, il socket è pronto per lo scambio di dati; in caso di errore, imposta errno, ad esempio per una connessione rifiutata.

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

Non è necessario usare bind

Di solito i client non usano bind: durante connect il kernel assegna automaticamente una porta sorgente effimera. Usi bind per un client solo quando è necessaria una porta sorgente specifica.

Passaggio 4: inviare dati

Dopo la connessione, scriva una richiesta con send. Ripeta l'operazione per assicurarsi che l'intero buffer venga inviato.

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

Passaggio 5: ricevere la risposta

Legga la risposta del server con recv. Aggiunga il terminatore nullo prima di trattare il buffer come una stringa.

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

Leggere fino alla chiusura

Una chiamata a recv potrebbe non restituire l'intera risposta. Ripeta l'operazione finché recv non restituisce 0, cioè finché l'interlocutore non chiude la connessione, per leggere una risposta completa arrivata in più parti.

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

Passaggio 6: chiudere

Chiami close(fd) per terminare la connessione e liberare il descrittore. In questo modo invia un FIN TCP, informando il server che il client ha terminato.

#include <unistd.h>

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

Chiusura parziale con shutdown

shutdown(fd, SHUT_WR) chiude solo la direzione di scrittura, segnalando la fine della richiesta e consentendo al client di continuare a leggere la risposta. È utile per i protocolli richiesta-risposta.

Gestire i problemi di connessione

Errori comuni del client: ECONNREFUSED (nessun server in ascolto), ETIMEDOUT (host irraggiungibile) ed EHOSTUNREACH. Verifichi sempre connect e segnali chiaramente gli errori all'utente.

Verifica rapida

Verifichi la Sua comprensione dei client TCP.

Riepilogo

Ha creato un client TCP.

  • socket, quindi connect all'indirizzo sockaddr_in del server
  • Non è necessario bind; il kernel sceglie una porta di origine
  • invii la richiesta, riceva la risposta (ripeta l'operazione per ottenere tutti i dati)
  • esegua close o shutdown al termine; gestisca gli errori di connect

Domande Frequenti

La lezione «Client TCP» è gratuita?

Sì — il testo completo di «Client TCP» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso C Academy, passa a CoddyKit PRO. Il corso C Academy include 4 lezioni in totale.

Cosa imparerò in «Client TCP»?

Connettersi e inviare dati Eserciti C Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare C Academy?

Non è richiesta alcuna esperienza precedente. C Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 3 di 4.

Quanto tempo richiede la lezione «Client TCP»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione C Academy?

Sì. Ogni lezione C Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Panoramica dei socket
  2. Server TCP
  3. Client TCP
  4. Gestire più client
← Torna a C Academy