Обзор сокетов
Основы сетевого взаимодействия
«Обзор сокетов» — бесплатный урок 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 — локальная установка не требуется.
Все уроки этого курса
- Обзор сокетов
- TCP-сервер
- TCP-клиент
- Обработка нескольких клиентов