0Pricing
C Academy · Lekcja

Klient TCP

Łączenie i wysyłanie

Klient TCP to bezpłatna lekcja C Academy na CoddyKit. To lekcja 3 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.

Budowanie klienta TCP

Klient TCP łączy się z serwerem, a następnie wysyła i odbiera dane. Jego cykl życia jest krótszy niż cykl życia serwera: utworzenie gniazda, połączenie, komunikacja i zamknięcie.

Krok 1: Utworzenie gniazda

Tak jak serwer, utwórz gniazdo strumieniowe dla IPv4 TCP.

#include <sys/socket.h>
#include <stdio.h>

int make_client_socket(void) {
    int fd = socket(AF_INET, SOCK_STREAM, 0);
    if (fd < 0) perror("socket");
    return fd;
}

Krok 2: Opisanie serwera

Wypełnij strukturę sockaddr_in portem i adresem IP serwera. Użyj inet_pton, aby przekonwertować adres IP w postaci kropkowanego ciągu na format binarny.

#include <arpa/inet.h>
#include <netinet/in.h>

int set_server(struct sockaddr_in *addr, const char *ip, unsigned short port) {
    addr->sin_family = AF_INET;
    addr->sin_port = htons(port);
    return inet_pton(AF_INET, ip, &addr->sin_addr); /* 1 on success */
}

Krok 3: Nawiązanie połączenia

connect() wykonuje uzgadnianie TCP z serwerem. Po pomyślnym zakończeniu gniazdo jest gotowe do przesyłania danych; w razie niepowodzenia ustawiana jest wartość errno (na przykład w przypadku odmowy połączenia).

#include <sys/socket.h>
#include <netinet/in.h>
#include <stdio.h>

int do_connect(int fd, struct sockaddr_in *addr) {
    if (connect(fd, (struct sockaddr *)addr, sizeof *addr) < 0) {
        perror("connect"); return -1;
    }
    return 0;
}

Bind nie jest potrzebny

Klienci zwykle pomijają bind: jądro automatycznie przypisuje tymczasowy port źródłowy podczas connect. Gniazdo klienta należy wiązać tylko wtedy, gdy potrzebny jest konkretny port źródłowy.

Krok 4: Wysyłanie danych

Po nawiązaniu połączenia wyślij żądanie za pomocą send. Wykonuj pętlę, aby mieć pewność, że cały bufor zostanie wysłany.

#include <sys/socket.h>
#include <string.h>

int send_all(int fd, const char *data) {
    size_t left = strlen(data);
    const char *p = data;
    while (left > 0) {
        ssize_t n = send(fd, p, left, 0);
        if (n <= 0) return -1;
        p += n; left -= (size_t)n;
    }
    return 0;
}

Krok 5: Odbieranie odpowiedzi

Odczytaj odpowiedź serwera za pomocą recv. Przed potraktowaniem bufora jako ciągu znaków zakończ go znakiem null.

#include <sys/socket.h>
#include <stdio.h>

void read_reply(int fd) {
    char buf[512];
    ssize_t n = recv(fd, buf, sizeof buf - 1, 0);
    if (n > 0) { buf[n] = 0; printf("server said: %s\n", buf); }
    else if (n == 0) printf("server closed connection\n");
}

Odczyt do zamknięcia połączenia

Pojedyncze wywołanie recv może nie zwrócić całej odpowiedzi. Wykonuj pętlę do chwili, gdy recv zwróci 0 (druga strona zamknęła połączenie), aby odczytać całą odpowiedź przychodzącą we fragmentach.

#include <sys/socket.h>
#include <stdio.h>

void drain(int fd) {
    char buf[256]; ssize_t n;
    while ((n = recv(fd, buf, sizeof buf, 0)) > 0)
        fwrite(buf, 1, (size_t)n, stdout);
}

Krok 6: Zamknięcie

Wywołaj close(fd), aby zakończyć połączenie i zwolnić deskryptor. Spowoduje to wysłanie TCP FIN, dzięki czemu serwer dowie się, że klient zakończył działanie.

#include <unistd.h>

void finish(int fd) {
    close(fd);
}

Częściowe zamknięcie za pomocą shutdown

shutdown(fd, SHUT_WR) zamyka tylko kierunek zapisu, sygnalizując koniec żądania, a jednocześnie pozwalając klientowi odczytać odpowiedź. Jest to przydatne w protokołach typu żądanie–odpowiedź.

Obsługa błędów połączenia

Typowe błędy po stronie klienta: ECONNREFUSED (brak nasłuchującego serwera), ETIMEDOUT (host nieosiągalny) oraz EHOSTUNREACH. Zawsze należy sprawdzać wynik connect i jasno informować użytkownika o błędach.

Szybkie sprawdzenie

Sprawdź swoją wiedzę na temat klientów TCP.

Podsumowanie

Zbudowano klienta TCP.

  • Utworzenie socketu, a następnie połączenie z serwerem za pomocą jego sockaddr_in
  • Nie trzeba wywoływać bind — jądro wybiera port źródłowy
  • Wysłanie żądania i odebranie odpowiedzi za pomocą recv (w przypadku pełnych danych należy użyć pętli)
  • Po zakończeniu należy wywołać close lub shutdown i obsłużyć błędy połączenia

Często zadawane pytania

Czy lekcja „Klient TCP” jest bezpłatna?

Tak — pełny tekst „Klient 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 „Klient TCP”?

Łączenie i wysyłanie Ć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 3 z 4.

Ile czasu zajmuje lekcja „Klient 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. Przegląd gniazd
  2. Serwer TCP
  3. Klient TCP
  4. Obsługa wielu klientów
← Powrót do C Academy