0Pricing
C Academy · Lekcja

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 / htonl konwersja z kolejności hosta do kolejności sieciowej (short/long)
  • ntohs / ntohl konwersja 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 gniazda
  • bind() przypisanie do adresu i portu
  • listen() oznaczenie jako pasywne
  • accept() odebranie połączenia

Kolejność wywołań klienta

Klient TCP jest prostszy:

  • socket() utworzenie gniazda
  • connect() 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_in wraz z htons i inet_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

  1. Przegląd gniazd
  2. Serwer TCP
  3. Klient TCP
  4. Obsługa wielu klientów
← Powrót do C Academy