C++ Academy · Lektion

Bygga en TCP-echo-server

Gå igenom en komplett implementation av en TCP-echo-server

Lektion 2 av 414 steg

Bygga en TCP-echo-server är en gratis lektion i C++ Academy på CoddyKit. Detta är lektion 2 av 4. Du kan läsa vilka 3 lektioner som helst i den här lärvägen kostnadsfritt i sin helhet – därefter låser CoddyKit PRO upp alla lektioner, plus praktisk övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Den ingår i lärvägen för C++ Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i C++ Academy innehåller totalt 4 lektioner.

Mål

Bygg en minimal TCP-server som accepterar en anslutning, läser byte och skriver tillbaka dem. Nätverksprogrammeringens motsvarighet till "Hello World".

Serverskelett

Serverflödet är: skapa socket, bind, lyssna, acceptera och hantera. Upprepa för alltid.

int srv = socket(AF_INET, SOCK_STREAM, 0);
bind(srv, (sockaddr*)&addr, sizeof(addr));
listen(srv, 10);
while (true) {
    int client = accept(srv, nullptr, nullptr);
    handle(client);
    close(client);
}

Alternativet Återanvänd adress

Ange SO_REUSEADDR så att servern kan starta om omedelbart utan att vänta på att operativsystemet ska frigöra porten.

int yes = 1;
setsockopt(srv, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(yes));

Echo-loopen

Läs in data i en buffer och skriv tillbaka samma byte. Avsluta när klienten stänger anslutningen.

void handle(int client) {
    char buf[1024];
    while (true) {
        ssize_t n = recv(client, buf, sizeof(buf), 0);
        if (n <= 0) break;          // closed or error
        send(client, buf, n, 0);
    }
}

Partiella läsningar och skrivningar

Både recv och send kan överföra färre byte än begärt. För ett strömbaserat protokoll ska ni iterera tills operationen är klar.

ssize_t total = 0;
while (total < n) {
    ssize_t s = send(client, buf + total, n - total, 0);
    if (s <= 0) break;
    total += s;
}

Hantera flera klienter

Det enklaste tillvägagångssättet är en ny tråd per anslutning. Det fungerar för hundratals klienter men får problem med tusentals.

while (true) {
    int client = accept(srv, nullptr, nullptr);
    std::thread([client]{ handle(client); close(client); }).detach();
}

Bättre: trådpool

Att starta en tråd per anslutning slösar resurser i stor skala. En trådpool med fast storlek och en arbetskö skalar bättre.

Graciös avstängning

Hantera SIGTERM/SIGINT för att stänga lyssningssocketen på ett ordnat sätt. RAII hjälper dessutom till att säkerställa att alla klientsocketar också stängs.

Felhantering

Behandla fel som förväntade händelser: klienter kopplar från, nätverk får tillfälliga problem och operativsystemets gränser nås. Logga och fortsätt – krascha inte på grund av en felaktig klient.

Logga varje klient

Logga fjärradressen för bättre observerbarhet.

sockaddr_in remote{};
socklen_t len = sizeof(remote);
int client = accept(srv, (sockaddr*)&remote, &len);
char ip[INET_ADDRSTRLEN];
inet_ntop(AF_INET, &remote.sin_addr, ip, sizeof(ip));
std::cout << "client " << ip << ":" << ntohs(remote.sin_port);

Testa med netcat

Testa er echo-server interaktivt med nc.

nc 127.0.0.1 8080
hello
hello       # echoed back

Bortom echo

Från echo kan ni utöka till:

  • Radbaserade protokoll (HTTP-liknande)
  • Ramade binära protokoll (längdprefix)
  • JSON- eller Protobuf-meddelanden

Snabbkontroll

Vad är syftet med socketalternativet SO_REUSEADDR?

Sammanfattning

En minimal TCP-echo-server består av socket, setsockopt SO_REUSEADDR, bind, listen och accept i en loop. För flera klienter kan ni starta trådar eller använda en trådpool. För hög skalbarhet kan ni byta till asynkron I/O (nästa lektion).

Gratis att börja

Lär dig C++ med en AI-lärare – gratis

Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.

Kurser
51
Lektioner
203

Vanliga frågor

Är lektionen ”Bygga en TCP-echo-server” gratis?

Ja – du kan läsa vilka 3 lektioner som helst i lärvägen C++ Academy, inklusive ”Bygga en TCP-echo-server”, kostnadsfritt i sin helhet här på webben. Därefter låser CoddyKit PRO upp alla lektioner, plus interaktiv övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Kursen i C++ Academy innehåller totalt 4 lektioner.

Vad lär jag mig i ”Bygga en TCP-echo-server”?

Gå igenom en komplett implementation av en TCP-echo-server Ni övar på C++ Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.

Behöver jag någon erfarenhet för att börja lära mig C++ Academy?

Du behöver inga förkunskaper. Utbildningen i C++ Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 2 av 4.

Hur lång tid tar lektionen ”Bygga en TCP-echo-server”?

De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.

Kan jag skriva och köra kod i den här C++ Academy-lektionen?

Ja. Varje C++ Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.

Alla lektioner i den här kursen

  1. BSD Sockets API i C++
  2. Bygga en TCP-echo-server
  3. Asynkron I/O med epoll och kqueue
  4. Använda Boost Asio för modern asynkron I/O
← Tillbaka till C++ Academy