0Pricing
C++ Academy · Lekcja

Budowa serwera echa TCP

Prześledź kompletną implementację serwera echa TCP

Budowa serwera echa TCP to bezpłatna lekcja C++ Academy na CoddyKit. To lekcja 2 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej C++ Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs C++ Academy zawiera 4 lekcji w sumie.

Cel

Zbuduj minimalny serwer TCP, który akceptuje połączenie, odczytuje bajty i zapisuje je z powrotem. To odpowiednik „Hello World” w programowaniu sieciowym.

Szkielet serwera

Przepływ działania serwera: utwórz gniazdo, wykonaj bind, listen, accept i obsłuż połączenie. Powtarzaj w nieskończoność.

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

Opcja ponownego użycia adresu

Ustaw SO_REUSEADDR, aby serwer mógł natychmiast uruchomić się ponownie bez oczekiwania na zwolnienie portu przez system operacyjny.

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

Pętla echa

Odczytaj dane do bufora i zapisz z powrotem te same bajty. Zakończ działanie, gdy klient zamknie połączenie.

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

Częściowe odczyty i zapisy

Zarówno recv, jak i send mogą przesłać mniej bajtów, niż zażądano. W protokole opartym na strumieniu powtarzaj operację w pętli aż do jej zakończenia.

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

Obsługa wielu klientów

Najprostsze podejście to nowy wątek dla każdego połączenia. Działa w przypadku setek klientów, ale zaczyna sobie nie radzić przy tysiącach.

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

Lepsze rozwiązanie: pula wątków

Tworzenie wątku dla każdego połączenia marnuje zasoby przy dużej skali. Stała pula wątków z kolejką zadań skaluje się lepiej.

Kontrolowane zamykanie

Obsłuż SIGTERM/SIGINT, aby poprawnie zamknąć gniazdo nasłuchujące. RAII pomaga również zagwarantować zamknięcie wszystkich gniazd klientów.

Obsługa błędów

Traktuj błędy jako coś oczekiwanego: klienci się rozłączają, sieć czasem zawodzi, a limity systemu operacyjnego mogą zostać wyczerpane. Zapisuj błędy w dzienniku i działaj dalej — nie kończ programu z powodu wadliwego klienta.

Rejestrowanie każdego klienta

Rejestruj zdalny adres, aby zapewnić obserwowalność.

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

Testowanie za pomocą netcat

Testuj interaktywnie serwer echa za pomocą nc.

nc 127.0.0.1 8080
hello
hello       # echoed back

Co dalej poza echem

Na bazie echa możesz przejść do:

  • protokołów opartych na wierszach (podobnych do HTTP)
  • ramkowych protokołów binarnych (z prefiksem długości)
  • komunikatów JSON lub Protobuf

Szybkie sprawdzenie

Do czego służy opcja gniazda SO_REUSEADDR?

Podsumowanie

Minimalny serwer echa TCP wykonuje kolejno: socket, setsockopt SO_REUSEADDR, bind, listen oraz accept w pętli. Aby obsługiwać wielu klientów, twórz wątki albo użyj puli wątków. Przy dużej skali przejdź na asynchroniczne wejście/wyjście (w następnej lekcji).

Często zadawane pytania

Czy lekcja „Budowa serwera echa TCP” jest bezpłatna?

Tak — pełny tekst „Budowa serwera echa TCP” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu C++ Academy, przejdź na CoddyKit PRO. Kurs C++ Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Budowa serwera echa TCP”?

Prześledź kompletną implementację serwera echa TCP Ćwiczysz C++ Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć C++ Academy?

Nie wymagamy żadnego doświadczenia. C++ Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 4.

Ile czasu zajmuje lekcja „Budowa serwera echa TCP”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji C++ Academy?

Tak. Każda lekcja C++ Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. API gniazd BSD w C++
  2. Budowa serwera echa TCP
  3. Asynchroniczne wejście/wyjście z epoll i kqueue
  4. Nowoczesne asynchroniczne wejście/wyjście z Boost Asio
← Powrót do C++ Academy