API сокетов BSD в C++
Используйте socket, bind, listen, accept, connect, send и recv в программах на C++.
«API сокетов BSD в C++» — бесплатный урок C++ Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C++ Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C++ Academy содержит 4 уроков всего.
Что такое API сокетов?
API сокетов BSD — фактический стандарт сетевого программирования. Он доступен в Linux, macOS, BSD и (с небольшими изменениями) в Windows через Winsock.
Необходимые заголовочные файлы
Подключите заголовочные файлы платформы и используйте типы POSIX.
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>Создание сокета
Вызов socket возвращает файловый дескриптор. Передайте семейство (IPv4), тип (TCP или UDP) и протокол (0 означает значение по умолчанию).
int sock = socket(AF_INET, SOCK_STREAM, 0);
if (sock < 0) {
perror("socket");
return 1;
}Структуры адресов
struct sockaddr_in хранит адрес IPv4 и порт. При передаче в функции приведите тип к struct sockaddr*.
struct sockaddr_in addr{};
addr.sin_family = AF_INET;
addr.sin_port = htons(8080);
inet_pton(AF_INET, "127.0.0.1", &addr.sin_addr);Порядок байтов: хост и сеть
Сетевой порядок байтов использует старший байт первым. Для преобразования используйте htons, htonl, ntohs, ntohl.
Подключение клиента
Используйте connect, чтобы установить TCP-соединение.
if (connect(sock, (sockaddr*)&addr, sizeof(addr)) < 0) {
perror("connect");
close(sock);
return 1;
}Отправка и получение
send и recv обмениваются байтами. Оба вызова могут вернуть меньше запрошенного количества — всегда используйте цикл.
const char* msg = "Hello";
send(sock, msg, strlen(msg), 0);
char buffer[1024];
ssize_t n = recv(sock, buffer, sizeof(buffer)-1, 0);
buffer[n] = '\0';Привязка и ожидание соединений (сервер)
Сервер привязывается к адресу, начинает ожидать соединения и принимает их.
int srv = socket(AF_INET, SOCK_STREAM, 0);
bind(srv, (sockaddr*)&addr, sizeof(addr));
listen(srv, 10);
int client = accept(srv, nullptr, nullptr);Закрытие сокета
Вызовите close в Unix или closesocket в Windows.
close(sock);Обработка ошибок
Функции сокетов возвращают -1 при ошибке и устанавливают значение errno. Проверяйте каждое возвращаемое значение.
Использование RAII-обёртки
Необёрнутые файловые дескрипторы легко забыть освободить. Оберните их в тип RAII, вызывающий close в деструкторе, или используйте std::unique_ptr с пользовательским удалителем.
struct SocketCloser {
void operator()(int* fd) const { if (*fd >= 0) ::close(*fd); }
};
using UniqueSocket = std::unique_ptr<int, SocketCloser>;Отличия Windows
В Windows:
- Подключите
<winsock2.h>и добавьте библиотекуws2_32 - Перед использованием вызовите
WSAStartup - Используйте
closesocketвместоclose - Тип сокета —
SOCKET(беззнаковый)
Быстрая проверка
Какой вызов устанавливает TCP-соединение клиента с сервером?
Итоги
API сокетов BSD предоставляет низкоуровневые примитивы для работы с сетью. Создайте сокет, настройте адрес, затем подключитесь как клиент или привяжите сокет, начните ожидание соединений и принимайте их как сервер. Преобразуйте порядок байтов с помощью семейства функций преобразования. Оборачивайте дескрипторы в RAII, чтобы предотвратить утечки.
Часто задаваемые вопросы
Урок «API сокетов BSD в C++» бесплатный?
Да — полный текст урока «API сокетов BSD в C++» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C++ Academy, подпишись на CoddyKit PRO. Курс C++ Academy содержит 4 уроков всего.
Чему я научусь в уроке «API сокетов BSD в C++»?
Используйте socket, bind, listen, accept, connect, send и recv в программах на C++. Ты практикуешь C++ Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать C++ Academy?
Предыдущий опыт не требуется. C++ Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «API сокетов BSD в C++»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке C++ Academy?
Да. Каждый урок C++ Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- API сокетов BSD в C++
- Создание эхо-сервера TCP
- Асинхронный IO с epoll и kqueue
- Использование Boost Asio для современного асинхронного IO