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
acceptrestituisce 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.