0Pricing
C++ Academy · Урок

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 — локальная установка не требуется.

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

  1. API сокетов BSD в C++
  2. Создание эхо-сервера TCP
  3. Асинхронный IO с epoll и kqueue
  4. Использование Boost Asio для современного асинхронного IO
← Назад к C++ Academy