Сеть

Тема дорожной карты · Modern C++ Developer

Сетевое программирование в C++ — это работа с TCP/UDP-сокетами поверх POSIX (BSD sockets), Windows Winsock или кроссплатформенных библиотек. В отличие от Python/Go, в стандартной библиотеке нет сетевого API (была попытка std::net в C++23 — снова отложена), поэтому индустрия консолидировалась вокруг нескольких де-факто стандартов: Boost.Asio для асинхронного I/O, gRPC C++ для RPC, ZeroMQ для message-passing, libevent для event-loop. C++26 ожидаемо принесёт std::execution с асинхронным framework-ом.

Как это работает

Boost.Asio — основа: io_context (event loop), asio::ip::tcp::socket (соединения), async_read, async_write, completion handlers через callbacks или coroutines (C++20 co_await). Модель — proactor pattern: ОС уведомляет о завершении операций (epoll/kqueue/IOCP под капотом). gRPC C++ — высокоуровневый RPC: .proto файл → grpc_cpp_plugin генерирует stubs, server реализует ServiceImpl, client вызывает stub-методы. Поддерживает unary, server-streaming, client-streaming, bidirectional streaming. ZeroMQ — message queue без брокера: zmq::context_t, zmq::socket_t с разными паттернами (REQ-REP, PUB-SUB, PUSH-PULL).

Когда применять

Asio — когда нужен thin-layer над raw сокетами с асинхронностью (низкоуровневые серверы, custom-протоколы, высокая производительность). gRPC — для service-to-service RPC, особенно когда обе стороны на C++ и важен throughput (тысячи RPS+) — Protobuf-сериализация быстрее JSON. ZeroMQ — для брокерлесс-распределённых систем (HFT, control planes, scientific computing). Boost.Beast — HTTP-сервер/клиент поверх Asio, когда нужна полная кастомизация (не подходит — Drogon, Crow, Pistache как альтернативы).

Типичные ошибки

Блокирующие вызовы в asio coroutine — ломают event loop, используйте только co_await async_*. Отсутствие back-pressure при async_write — если consumer медленнее producer, очередь растёт безгранично. gRPC без deadlines — зависшие RPC висят навечно, всегда устанавливайте ClientContext::set_deadline(). Игнорирование TCP SO_KEEPALIVE — мёртвые соединения не обнаруживаются. Использование blocking-сокетов в production-сервере вместо асинхронных — низкая масштабируемость.

Связанные понятия

Полезные ресурсы