Przegląd gniazd
Podstawy komunikacji sieciowej
Przegląd gniazd to bezpłatna lekcja C Academy na CoddyKit. To lekcja 1 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.
Czym jest gniazdo
Gniazdo to punkt końcowy komunikacji sieciowej. W systemach POSIX jest deskryptorem pliku, z którego można czytać i do którego można zapisywać, co pozwala dwóm programom wymieniać dane przez sieć lub na tej samej maszynie.
Model klient-serwer
Większość aplikacji sieciowych korzysta z modelu klient-serwer:
- Serwer przypisuje gniazdo do adresu i oczekuje na połączenia
- Klient inicjuje połączenie z serwerem
Po nawiązaniu połączenia obie strony wysyłają i odbierają dane.
TCP a UDP
Dwa główne protokoły transportowe:
- TCP (SOCK_STREAM): niezawodny, uporządkowany, oparty na połączeniu
- UDP (SOCK_DGRAM): szybki, bezpołączeniowy, może gubić pakiety lub zmieniać ich kolejność
TCP należy używać, gdy ważna jest poprawność, a UDP — do strumieniowania z małymi opóźnieniami.
Tworzenie gniazda
Wywołanie socket() zwraca deskryptor pliku. Argumenty to: rodzina adresów (AF_INET dla IPv4), typ (SOCK_STREAM dla TCP) oraz protokół (0 oznacza domyślny).
/* Conceptual: sockets need a network environment to run */
#include <sys/socket.h>
#include <netinet/in.h>
int create_tcp_socket(void) {
int fd = socket(AF_INET, SOCK_STREAM, 0);
/* fd < 0 means error; check with perror */
return fd;
}Struktury adresów gniazd
Adres IPv4 opisuje struktura struct sockaddr_in, zawierająca rodzinę adresów, port i adres IP. Funkcje przyjmują ogólny typ struct sockaddr *, dlatego należy wykonać rzutowanie.
#include <netinet/in.h>
void fill_addr(struct sockaddr_in *addr, unsigned short port) {
addr->sin_family = AF_INET;
addr->sin_port = htons(port); /* host to network short */
addr->sin_addr.s_addr = INADDR_ANY; /* all interfaces */
}Znaczenie kolejności bajtów
Sieci używają formatu big-endian (sieciowej kolejności bajtów). Konwersję wykonują funkcje:
htons/htonlkonwersja z kolejności hosta do kolejności sieciowej (short/long)ntohs/ntohlkonwersja z kolejności sieciowej do kolejności hosta
Zawsze należy konwertować porty i adresy, w przeciwnym razie komunikacja będzie kierowana do niewłaściwego miejsca.
Konwersja adresu IP
inet_pton konwertuje tekstowy adres IP, taki jak "127.0.0.1", do postaci binarnej przechowywanej w sin_addr, a inet_ntop wykonuje konwersję odwrotną na potrzeby wyświetlania.
#include <arpa/inet.h>
#include <netinet/in.h>
int set_ip(struct sockaddr_in *addr, const char *ip) {
return inet_pton(AF_INET, ip, &addr->sin_addr); /* returns 1 on success */
}Kolejność wywołań serwera
Serwer TCP zazwyczaj wywołuje kolejno:
socket()utworzenie gniazdabind()przypisanie do adresu i portulisten()oznaczenie jako pasywneaccept()odebranie połączenia
Kolejność wywołań klienta
Klient TCP jest prostszy:
socket()utworzenie gniazdaconnect()nawiązanie połączenia z adresem serwera
Następnie może używać send i recv na tym samym deskryptorze.
Wysyłanie i odbieranie
Należy używać send() i recv() (lub ogólnych funkcji write() i read()). Obie operacje mogą przesłać mniej bajtów, niż zażądano, dlatego rzeczywisty kod wykonuje pętlę, aż obsłuży wszystkie dane.
Zawsze sprawdzaj wartości zwracane
Każde wywołanie funkcji gniazda może się nie powieść. Wartość -1 ustawia errno; należy wywołać perror, aby zgłosić błąd. Wartość 0 zwrócona przez recv oznacza, że druga strona zamknęła połączenie. Solidna komunikacja sieciowa zależy od sprawdzania błędów.
Szybkie sprawdzenie
Sprawdź swoją wiedzę na temat podstaw gniazd.
Podsumowanie
Ukończyli Państwo naukę podstaw programowania gniazd.
- Gniazdo jest punktem końcowym sieci i deskryptorem pliku
- Model klient-serwer z TCP (niezawodnym) lub UDP (szybkim)
- Należy używać
sockaddr_inwraz zhtonsiinet_pton - Serwer: socket, bind, listen, accept. Klient: socket, connect
Często zadawane pytania
Czy lekcja „Przegląd gniazd” jest bezpłatna?
Tak — pełny tekst „Przegląd gniazd” 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 „Przegląd gniazd”?
Podstawy komunikacji sieciowej Ć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 1 z 4.
Ile czasu zajmuje lekcja „Przegląd gniazd”?
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
- Przegląd gniazd
- Serwer TCP
- Klient TCP
- Obsługa wielu klientów