0Pricing
C Academy · Lezione

Server TCP

Accettare connessioni

Server TCP è una lezione C Academy gratuita su CoddyKit. Questa è la lezione 2 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 server TCP

Un server TCP attende i client e accetta le loro connessioni. Il ciclo di vita è: creare un socket, associarlo a una porta, metterlo in ascolto e poi accettare le connessioni in un ciclo.

Passaggio 1: creare il socket

Crei un socket di tipo stream per TCP su IPv4. Un risultato negativo indica un errore.

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

Passaggio 2: consentire il riutilizzo dell'indirizzo

Per impostazione predefinita, dopo l'arresto del server una porta rimane in TIME_WAIT, impedendo il riavvio. Imposti SO_REUSEADDR con setsockopt per poterla associare nuovamente subito.

#include <sys/socket.h>

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

Passaggio 3: associare il socket a una porta

bind() associa il socket a un indirizzo e a una porta locali. INADDR_ANY mette il socket in ascolto su tutte le interfacce di rete.

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

Passaggio 4: mettersi in ascolto

listen() imposta il socket come passivo, pronto ad accettare connessioni. L'argomento backlog stabilisce quante connessioni in attesa il kernel può accodare.

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

Passaggio 5: accettare le connessioni

accept() si blocca finché un client non si connette, quindi restituisce un socket nuovo per quel client. Il socket originale continua a rimanere in ascolto.

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

Due socket, due ruoli

Dopo accept dispone di due socket:

  • Il socket in ascolto continua ad accettare nuovi client
  • Il socket di connessione comunica con un client specifico

Chiuda il socket di connessione al termine della gestione del client.

Leggere la richiesta

Usi recv per leggere i dati del client in un buffer. Un valore restituito pari a 0 indica che il client si è disconnesso; -1 indica un errore.

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

Inviare una risposta

Risponda con send. Per dati di grandi dimensioni, ripeta l'operazione finché tutti i byte non sono stati inviati, poiché una singola chiamata potrebbe scrivere solo una parte del buffer.

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

Il ciclo di accept

Un semplice server iterativo accetta un client, lo serve, chiude la connessione e torna quindi ad accettare il client successivo. Gestisce i client uno alla volta.

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

Arresto regolare

Chiuda il socket in ascolto quando il server si arresta e gestisca SIGINT per interrompere il ciclo in modo ordinato. Chiuda sempre i descrittori per liberare le risorse del kernel.

Verifica rapida

Verifichi la propria comprensione dei server TCP.

Riepilogo

Ha creato un server TCP passo dopo passo.

  • socket, quindi SO_REUSEADDR, bind, listen e accept
  • accept restituisce un nuovo socket per ogni client
  • recv/send per comunicare, quindi close per chiudere la connessione
  • Usi un ciclo per servire i client e controlli ogni valore restituito

Domande Frequenti

La lezione «Server TCP» è gratuita?

Sì — il testo completo di «Server 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 «Server TCP»?

Accettare connessioni 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 2 di 4.

Quanto tempo richiede la lezione «Server 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