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.