0Pricing
C++ Academy · Lezione

API dei socket BSD in C++

Usi socket, bind, listen, accept, connect, send e recv nei programmi C++

API dei socket BSD in C++ è una lezione C++ Academy gratuita su CoddyKit. Questa è la lezione 1 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.

Che cos'è l'API dei socket?

L'API dei socket BSD è lo standard de facto per la programmazione di rete. È disponibile su Linux, macOS e BSD e, con lievi modifiche, su Windows tramite Winsock.

Header necessari

Includa gli header della piattaforma e usi i tipi POSIX.

#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>

Creazione di un socket

La chiamata socket restituisce un descrittore di file. Passi la famiglia (IPv4), il tipo (TCP o UDP) e il protocollo (0 per usare quello predefinito).

int sock = socket(AF_INET, SOCK_STREAM, 0);
if (sock < 0) {
    perror("socket");
    return 1;
}

Strutture degli indirizzi

struct sockaddr_in contiene un indirizzo IPv4 e una porta. Esegua il cast a struct sockaddr* quando lo passa alle funzioni.

struct sockaddr_in addr{};
addr.sin_family = AF_INET;
addr.sin_port = htons(8080);
inet_pton(AF_INET, "127.0.0.1", &addr.sin_addr);

Ordine dei byte: host e rete

L'ordine dei byte di rete è big-endian. Usi htons, htonl, ntohs e ntohl per la conversione.

Connessione di un client

Usi connect per avviare una connessione TCP.

if (connect(sock, (sockaddr*)&addr, sizeof(addr)) < 0) {
    perror("connect");
    close(sock);
    return 1;
}

Invio e ricezione

send e recv scambiano byte. Entrambe possono restituire meno byte di quelli richiesti: esegua sempre un ciclo.

const char* msg = "Hello";
send(sock, msg, strlen(msg), 0);

char buffer[1024];
ssize_t n = recv(sock, buffer, sizeof(buffer)-1, 0);
buffer[n] = '\0';

Binding e ascolto (server)

Un server esegue il binding a un indirizzo, resta in ascolto e accetta le connessioni.

int srv = socket(AF_INET, SOCK_STREAM, 0);
bind(srv, (sockaddr*)&addr, sizeof(addr));
listen(srv, 10);
int client = accept(srv, nullptr, nullptr);

Chiusura del socket

Chiami close su Unix o closesocket su Windows.

close(sock);

Gestione degli errori

Le funzioni dei socket restituiscono -1 in caso di errore e impostano errno. Controlli ogni valore restituito.

Involucro RAII

I descrittori di file non incapsulati possono essere facilmente persi. Li incapsuli in un tipo RAII con una chiamata a close nel distruttore, oppure usi std::unique_ptr con un deleter personalizzato.

struct SocketCloser {
    void operator()(int* fd) const { if (*fd >= 0) ::close(*fd); }
};
using UniqueSocket = std::unique_ptr<int, SocketCloser>;

Differenze su Windows

Su Windows:

  • Includa <winsock2.h> e colleghi ws2_32
  • Chiami WSAStartup prima dell'uso
  • Usi closesocket invece di close
  • Il tipo del socket è SOCKET (senza segno)

Verifica rapida

Quale chiamata di funzione avvia una connessione TCP da un client a un server?

Riepilogo

L'API dei socket BSD offre primitive di rete a basso livello. Crei un socket, configuri un indirizzo, quindi esegua connect (client) oppure bind+listen+accept (server). Converta l'ordine dei byte usando la famiglia htons. Incapsuli i descrittori in RAII per evitare perdite di risorse.

Domande Frequenti

La lezione «API dei socket BSD in C++» è gratuita?

Sì — il testo completo di «API dei socket BSD in C++» è 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 «API dei socket BSD in C++»?

Usi socket, bind, listen, accept, connect, send e recv nei programmi C++ 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 1 di 4.

Quanto tempo richiede la lezione «API dei socket BSD in C++»?

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. API dei socket BSD in C++
  2. Costruire un server echo TCP
  3. I/O asincrono con epoll e kqueue
  4. Usare Boost Asio per l'I/O asincrono moderno
← Torna a C++ Academy