0Pricing
C Academy · Урок

Обзор сокетов

Основы сетевого взаимодействия

«Обзор сокетов» — бесплатный урок C Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C Academy содержит 4 уроков всего.

Что такое сокет

Сокет — это конечная точка сетевого взаимодействия. В системах POSIX он является дескриптором файла, из которого можно читать и в который можно записывать, благодаря чему две программы обмениваются данными по сети или на одном компьютере.

Модель «клиент — сервер»

Большинство сетевых приложений используют модель «клиент — сервер»:

  • сервер связывается с адресом и ожидает подключений
  • клиент инициирует подключение к серверу

После подключения обе стороны отправляют и получают данные.

TCP и UDP

Два основных транспортных протокола:

  • TCP (SOCK_STREAM): надёжный, упорядоченный, с установлением соединения
  • UDP (SOCK_DGRAM): быстрый, без установления соединения; пакеты могут теряться или приходить в другом порядке

Используйте TCP для корректности, а UDP — для потоковой передачи с малой задержкой.

Создание сокета

Вызов socket() возвращает дескриптор файла. Аргументы: семейство адресов (AF_INET для IPv4), тип (SOCK_STREAM для TCP) и протокол (0 — значение по умолчанию).

/* 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;
}

Структуры адресов сокетов

Адрес IPv4 описывается структурой struct sockaddr_in, содержащей семейство адресов, порт и IP-адрес. Функции принимают универсальный тип struct sockaddr *, поэтому выполняется преобразование типа.

#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 */
}

Порядок байтов имеет значение

В сетях используется порядок байтов от старшего к младшему (сетевой порядок байтов). Выполняйте преобразование с помощью:

  • htons / htonl — из порядка хоста в сетевой (короткое/длинное значение)
  • ntohs / ntohl — из сетевого порядка в порядок хоста

Всегда преобразуйте порты и адреса, иначе Вы будете обращаться не туда.

Преобразование IP-адреса

inet_pton преобразует текстовый IP-адрес, например "127.0.0.1", в двоичную форму, хранящуюся в sin_addr, а inet_ntop выполняет обратное преобразование для вывода.

#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 */
}

Последовательность вызовов сервера

TCP-сервер обычно вызывает функции в следующем порядке:

  • socket() — создать
  • bind() — связать с адресом и портом
  • listen() — перевести в пассивный режим
  • accept() — получить подключение

Последовательность вызовов клиента

TCP-клиент устроен проще:

  • socket() — создать
  • connect() — подключиться к адресу сервера

После этого он может использовать send и recv с тем же дескриптором.

Отправка и получение данных

Используйте send() и recv() (или универсальные write() и read()). Оба вызова могут передать меньше байтов, чем было запрошено, поэтому в рабочем коде нужно повторять вызовы, пока все данные не будут обработаны.

Всегда проверяйте возвращаемые значения

Любой вызов сокета может завершиться ошибкой. При возврате -1 устанавливается значение errno; вызовите perror, чтобы сообщить об ошибке. Возврат 0 из recv означает, что другая сторона закрыла соединение. Надёжность сетевого кода зависит от проверки ошибок.

Быстрая проверка

Проверьте, насколько хорошо Вы поняли основы работы с сокетами.

Итоги

Вы изучили основы программирования с использованием сокетов.

  • Сокет — это конечная точка сети и дескриптор файла
  • Модель «клиент — сервер» с TCP (надёжным) или UDP (быстрым)
  • Используйте sockaddr_in вместе с htons и inet_pton
  • Сервер: socket, bind, listen, accept. Клиент: socket, connect

Часто задаваемые вопросы

Урок «Обзор сокетов» бесплатный?

Да — полный текст урока «Обзор сокетов» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C Academy, подпишись на CoddyKit PRO. Курс C Academy содержит 4 уроков всего.

Чему я научусь в уроке «Обзор сокетов»?

Основы сетевого взаимодействия Ты практикуешь C Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать C Academy?

Предыдущий опыт не требуется. C Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.

Сколько времени занимает урок «Обзор сокетов»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке C Academy?

Да. Каждый урок C Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Обзор сокетов
  2. TCP-сервер
  3. TCP-клиент
  4. Обработка нескольких клиентов
← Назад к C Academy