Skip to content

Repository files navigation

cnetmod

Production-oriented C++23 asynchronous networking infrastructure built on native coroutines and platform-native I/O backends.

In the age of AI-assisted programming, architectural maturity has leveled the differences in development difficulty; performance and efficiency are the only decisive benchmarks.

Linux Build macOS Build Windows Build

English | 简体中文

Platform Support

Platform I/O Engine Compiler Status
Windows IOCP Latest Visual Studio 2026 (MSVC) ✅
Linux io_uring + epoll clang-21 + libc++ ✅
macOS kqueue clang-21 + libc++ ✅

AI Development Skills

The skill/ directory contains the project-specific instructions for AI-assisted development. AI agents should read skill/SKILL.md first, then consult the topic-specific guidance under skill/core, skill/coro, skill/database, skill/http, skill/infra, skill/protocols, and skill/security as needed.

Engineering Evidence

  • Architecture: C++23 module interfaces with platform-specific implementations selected by CMake; native IOCP, io_uring, epoll, and kqueue backends share the same coroutine-facing APIs.
  • Verification: GitHub Actions builds target Linux, macOS, and Windows configurations. The repository includes unit, protocol interoperability, benchmark, chaos, and restart-recovery test paths.
  • Reproducibility: Performance sections identify hardware, compiler, backend, workload, and concurrency parameters, and point to local benchmark targets for verification.
  • Operational behavior: Protocol clients and brokers include reconnect, retry, flow-control, persistence, TLS/mTLS, and recovery mechanisms where applicable; asynchronous APIs use structured results and error codes.

Features

Core Runtime

  • Coroutine engine: task<T>, spawn() fire-and-forget, symmetric transfer for tail-call optimization
  • I/O context: Platform-native event loop (IOCP / io_uring / epoll / kqueue) with thread-safe post()
  • Multi-core: server_context with a dedicated accept thread, N worker io_context threads, and a cnetmod-owned CPU pool
  • Coroutine scheduling: io_scheduler, task_group, and blocking_invoke() keep scheduling and structured concurrency in cnetmod APIs

Networking

  • TCP: Async accept / connect / read / write with RAII socket wrappers
  • UDP: Async sendto / recvfrom
  • TLS/SSL: OpenSSL-backed ssl_context / ssl_stream with async handshake, SNI, client certificate support
  • Async DNS: async_resolve() — structured offload of getaddrinfo to the internal CPU pool, resumed on the caller's io_context
  • Serial port: Cross-platform async serial I/O

Protocols

  • HTTP/1.1 & HTTP/2: Full server with router, middleware pipeline, chunked transfer, multipart upload; HTTP/2 via TLS + ALPN negotiation with multiplexed streams
  • HTTP/3 / QUIC: Full client and server with TLS 1.3, ALPN, dynamic-table QPACK, multiplexed streams, connection migration, multipath, and path-MTU discovery
  • WebSocket: Server-side upgrade from HTTP, frame codec, ping/pong, per-message deflate
  • SOCKS5: Proxy protocol client and server — CONNECT, BIND, UDP ASSOCIATE commands; authentication methods (no auth, username/password, RFC 1961 GSSAPI provider callbacks); IPv4, IPv6, and domain name support
  • MQTT v3.1.1 / v5.0: Full broker + async client — QoS 0/1/2, retained messages, will, session resume, shared subscriptions, topic alias, auto-reconnect; sync client wrapper
  • Kafka: Async producer and consumer groups — metadata discovery, API-version negotiation, record batches, gzip/LZ4 compression, idempotent and transactional production, cooperative-sticky rebalancing, manual offset commits, SASL/TLS, retry and reconnect handling
  • AMQP 0-9-1: RabbitMQ-compatible async client — channels, durable exchanges/queues/bindings, publisher confirms, QoS/prefetch, ACK/NACK, transactions, heartbeats, automatic reconnection and topology recovery, SASL/TLS
  • AMQP 1.0: Artemis-compatible async client — SASL/TLS connections, sessions, sender/receiver links, credit-based flow control, unsettled delivery outcomes, explicit settlement, transactions, reconnect and link recovery
  • MySQL: Async client with prepared statements, connection pool, pipeline, transaction management, and ORM (CRUD / migration / query builder / MyBatis-Plus style XML mappers / BaseMapper / pagination / soft delete / optimistic lock / multi-tenant / cache / opt-in database-table sharding / explicit scatter-gather / XA two-phase commit)
  • PostgreSQL: Async TLS client with SCRAM-SHA-256/MD5 authentication, prepared queries, cancellation, and seamless reuse of the MySQL ORM model/query/session API
  • MongoDB: Async BSON/OP_MSG client with TLS, SCRAM-SHA-256, capability negotiation, strict protocol limits, and correlated command execution
  • Redis: Async client with RESP protocol, connection pool
  • Raft: Replicated state machine toolkit with leader election, log replication, ReadIndex, leader lease / check-quorum, joint consensus membership changes, snapshot install / compaction, LevelDB-backed persistence, TCP transport, TLS / mTLS authentication, transport metrics, chaos / restart tests, and distributed storage examples
  • Modbus: Complete protocol implementation — TCP/UDP/RTU (serial) client and server, all standard function codes, connection pool, CRC-16 validation, frame timing control, data stores (mutex-based and lock-free channel-based)
  • CoAP: CoAP for constrained devices — RFC 7252 message/option codec, confirmable request retransmission, Observe subscriptions/notifications, token/message-id matching, resource router, Block1/Block2 helpers, CoAPS/DTLS context support
  • OpenAI: Async API client (chat completions, etc.)

Raft Performance

Release benchmark on Intel Core i9-14900K:

Scenario Throughput
Single-node append + commit ~5.17M - 5.50M ops/s
5-node majority replication ~0.80M - 0.83M ops/s

Use testing/bench/bench_raft.cpp for reproducible local measurements. Actual results depend on compiler, allocator, storage backend, CPU frequency policy, and network / loopback environment.

Full guide: Raft. Embedding guide for host projects with overlapping dependencies: Third-party Dependency Integration.

Cross-language HTTP Performance

The reproducible runner in testing/bench/crosslang covers cnetmod and Rust together with Go 1.26 (net/http, fasthttp, quic-go) and Java 26 (JDK virtual threads and Jetty). On Arch Linux/WSL2 with Go 1.26.5 and OpenJDK 26.0.2, the Go HTTP/1.1, h2c, HTTPS/2, and HTTP/3 smoke paths passed; Java virtual-thread HTTP/1.1/TLS and Jetty HTTP/1.1, h2c, and HTTPS/2 passed. Jetty 12.1.11 HTTP/3 starts but times out with the local curl HTTP/3 client, so it is intentionally excluded from the default measured set and has no published throughput claim. See the runner README for commands, environment capture, and the experimental diagnosis command.

This is the directly comparable full run: cnetmod, Rust, Statico, Go, and Java share the pinned 16-server-CPU / 16-client-CPU layout, oha 1.15.0, three runs, and the /hello response. Red rows are incomplete results and must not be used as throughput rankings. In particular, JDK virtual threads reached only 99.34% for HTTP/1.1 and 90.29% for HTTPS/1.1; Jetty HTTP/3 starts but times out, so it does not appear as a measured HTTP/3 row.

Cross-language HTTP throughput comparison

Raw JSON, the machine environment, and the generated CSV/Markdown summary are kept in testing/bench/results/crosslang/2026-08-05-arch-go-java26.

Arch Linux under WSL2, Release build, Intel Core i9-14900K, Clang 22.1.8, Linux 6.18, io_uring, mimalloc, and local loopback. Server and Rust oha client are isolated to separate 16-CPU sets. cnetmod enables IORING_SETUP_COOP_TASKRUN; fixed worker affinity is disabled because it reduced throughput in this environment. HTTP/1.1 uses 1,000,000 requests per run; HTTP/2 uses 250,000; HTTP/3 uses 10,000. Each value is the mean of three runs. The table includes every implementation/protocol endpoint measured in this campaign; unavailable endpoints are stated explicitly.

The compact tables below are organized by protocol. Latency is shown as P50 / P99 in milliseconds; complete P0/P50/P95/P99/P100 data remains in the linked raw JSON and CSV so the README stays readable.

HTTP/1.1

Implementation Throughput P50 / P99 ms Success vs Rust Result
cnetmod 1.501M req/s 0.132 / 0.682 100.00% +41.7% passed
Statico/tokio-uring 1.485M req/s 0.138 / 0.551 100.00% +40.2% passed
Statico/monoio 1.439M req/s 0.144 / 0.489 100.00% +35.8% passed
Go fasthttp 1.112M req/s 0.167 / 0.853 100.00% +4.9% passed
Rust Hyper 1.059M req/s 0.215 / 0.561 100.00% baseline passed
Java 26 / Jetty 678K req/s 0.157 / 1.489 100.00% -36.0% passed
Go net/http 510K req/s 0.117 / 5.277 100.00% -51.8% passed
Java 26 / JDK virtual threads 482K req/s 0.464 / 2.020 99.34% — partial; not ranked

HTTPS/1.1

Implementation Throughput P50 / P99 ms Success vs Rust Result
cnetmod 1.192M req/s 0.165 / 0.804 100.00% +34.0% passed
Go fasthttp 1.021M req/s 0.185 / 0.838 100.00% +14.8% passed
Rust Hyper 889K req/s 0.246 / 0.640 100.00% baseline passed
Go net/http 587K req/s 0.161 / 3.529 100.00% -33.9% passed
Java 26 / Jetty 455K req/s 0.247 / 2.791 100.00% -48.9% passed
Java 26 / JDK virtual threads 56K req/s 0.364 / 51.770 90.29% — partial; not ranked

HTTP/2 h2c

Implementation Throughput P50 / P99 ms Success vs Rust Result
cnetmod 1.354M req/s 0.180 / 0.393 100.00% +18.6% passed
Rust monoio-h2 1.142M req/s 0.209 / 0.400 100.00% baseline passed
Java 26 / Jetty 558K req/s 0.318 / 2.889 100.00% -51.2% passed
Go net/http 240K req/s 0.767 / 4.181 100.00% -79.0% passed
Rust Hyper 104K req/s 0.163 / 44.086 100.00% -90.9% passed

HTTPS/2

Implementation Throughput P50 / P99 ms Success vs Rust Result
cnetmod 1.106M req/s 0.194 / 0.404 100.00% +1067.5% passed
Java 26 / Jetty 379K req/s 0.455 / 4.097 100.00% +299.8% passed
Go net/http 247K req/s 0.740 / 3.961 100.00% +160.3% passed
Rust Hyper 95K req/s 0.172 / 44.782 100.00% baseline passed

HTTP/3

Implementation Throughput P50 / P99 ms Success vs Rust Result
cnetmod 259K req/s 0.359 / 1.589 100.00% +39.7% passed
Rust Quinn/h3 185K req/s 0.601 / 4.012 100.00% baseline passed
Go quic-go 332 req/s 0.905 / 4.147 100.00% -99.8% passed
Java 26 / Jetty unavailable — 0.00% — request timeout

The HTTP/1.1 comparison uses the same 13-byte body and only Content-Length on both servers. cnetmod's normal Server, Date, and Content-Type behavior remains the default; the benchmark explicitly disables server-generated headers with response_header_options to match Statico. Raw JSON, latency percentiles, success rates, tool versions, kernel, CPU allocation, and runtime switches are retained under testing/bench/results/crosslang/2026-08-05-arch-go-java26.

HTTP / gRPC Performance

Windows Release benchmark on Intel Core i9-14900K, Visual Studio 2026, IOCP, local loopback, multicore mode (mc:16/16):

Benchmark Command Throughput
HTTP/1.1 cleartext bench_http.exe 1000 16 multicore 338.66K req/s
HTTP/2 h2c bench_http.exe 1000 16 multicore 255.04K req/s
HTTPS/1.1 bench_http.exe 1000 16 multicore 306.28K req/s
HTTPS/2 bench_http.exe 1000 16 multicore 235.49K req/s
WebSocket echo bench_ws.exe 1000 16 456.59K msg/s
WebSocket Secure echo bench_ws.exe 1000 16 400.70K msg/s
gRPC unary over HTTP/2 h2c bench_grpc.exe 5000 16 multicore 220.84K req/s
HTTP/3 GET /health h3_benchmark --connections 256 --client-workers 16 --concurrency 2 --requests 1000 --warmup 25 --runs 5 77.59K req/s, P50 6.404 ms, P99 9.276 ms, 100.00%

The HTTP/1.1 through gRPC rows are three-run means; every HTTP/HTTPS run completed 16,000/16,000 requests per protocol, every WS/WSS run completed 16,000/16,000 echo round-trips per protocol, and every gRPC run completed 80,000/80,000 unary calls. Per-run figures are retained in testing/bench/results/windows-http-grpc-2026-08-05.md. The HTTP/3 row is the five-run mean of 1,280,000/1,280,000 successful requests on the same Windows machine. It uses 256 persistent QUIC connections and two concurrent streams per connection; its 6,400 warm-up requests are excluded from timing. Connection startup is ramped only before warm-up to avoid an IOCP UDP handshake burst; it does not alter the connection count, stream concurrency, request count, response, or success criterion used by the oha comparison. The gRPC correctness suite includes Python grpcio cross-process interoperability tests in both directions. Results are local-loopback numbers and vary with CPU power policy, TLS library, worker count, and concurrent system load.

Native-client HTTP/3 Benchmark (Legacy Baseline)

The cross-language HTTP/3 result above is the current server-capacity result. The older native cnetmod client/server baseline below is retained only for historical reproducibility and must not be used as the current throughput figure.

Arch Linux under WSL2, Release build, Intel Core i9-14900K, Clang 22.1.8, io_uring and local loopback. The server uses 16 I/O workers; the client uses 16 I/O workers and 256 persistent QUIC connections with two concurrent request streams per connection. Each of five runs measures 256,000 requests after 6,400 aggregate warm-up requests (25 per connection):

Benchmark Command Result
HTTP/3 GET /health h3_benchmark --connections 256 --client-workers 16 --concurrency 2 --requests 1000 --warmup 25 --runs 5 avg ~123.22K req/s (117.96K–131.19K), avg P50 3.259 ms, avg P99 7.216 ms

All five measured runs completed with 256000/256000 successful requests and zero failures. This is aggregate multicore capacity measured through the public cnetmod HTTP/3 client/server API, including UDP, QUIC, TLS 1.3, QPACK and HTTP/3; it is not a frame-codec microbenchmark. A separate one-connection, one-worker diagnostic averages about 21.77K req/s and must not be compared with multicore server-capacity results. The three-byte response makes QPS and latency the relevant values; payload bandwidth is intentionally not presented as a network- throughput claim. The benchmark records its complete configuration, CPU time, RSS, latency distribution and failures in JSON. See HTTP/3 benchmark for reproduction steps.

MQTT Performance

Windows Release benchmark on Intel Core i9-14900K, Visual Studio 2026, IOCP, local loopback, 4 broker workers, 8 publishers, QoS 0, write_batch=16:

Benchmark Command Result
MQTT QoS0 broker/client burst bench_mqtt.exe 20000 8 clientburst multi avg ~128.18K msg/s, peak ~133.78K msg/s

Five consecutive runs completed with 160000 ok, 0 failed each. Broker metrics reached routed=160000 and delivered=160000 on every run.

Quick Start

Build Requirements

CMake 4.0+ is required for C++23 module support.

Windows: Latest Visual Studio 2026 with C++23 modules enabled.

Linux: clang-21 with libc++ and liburing-dev installed.

wget https://apt.llvm.org/llvm.sh && chmod +x llvm.sh
sudo ./llvm.sh 21 all
sudo apt install libc++-21-dev libc++abi-21-dev liburing-dev

macOS: Homebrew LLVM 21+ (system clang does not support C++23 modules).

brew install llvm ninja cmake
export PATH="/opt/homebrew/opt/llvm/bin:$PATH"  # Apple Silicon
export PATH="/usr/local/opt/llvm/bin:$PATH"      # Intel Mac

Clone and Build

The repository supports three common build paths:

  • System CMake build (system): native CMake using installed libraries and the pinned Git submodules under 3rdparty.
  • vcpkg manifest build: lets vcpkg own the dependencies; on Windows + VS 2026 use the included x64-windows-vs2026 overlay triplet.
  • Conan build/package: supports Conan-based distribution and reuse; conan create validates recipe export, isolated build, and packaging.

On push and pull requests, GitHub Actions builds cnetmod_core on Windows, Linux, and macOS. Run a workflow manually for its full test and interoperability gates; this keeps the everyday core build separate from the heavier test suite.

# Clone the repository
git clone https://github.com/banderzhm/cnetmod.git
cd cnetmod

# Initialize submodules (required for third-party dependencies)
git submodule update --init --recursive

# Build
cmake -B build -DCNETMOD_DEPENDENCY_MODE=system -DCNETMOD_BUILD_EXAMPLES=ON
cmake --build build

# Build every cnetmod target explicitly
cmake --build build --target cnetmod_build_all

# Visual Studio generators with C++ modules: use single-node MSBuild
cmake --build build --target cnetmod_build_all --config Debug

Build with vcpkg

The repository includes vcpkg.json, so a user with vcpkg can let manifest mode install the supported third-party dependencies:

cmake -B build-vcpkg \
  -DCMAKE_TOOLCHAIN_FILE="$VCPKG_ROOT/scripts/buildsystems/vcpkg.cmake" \
  -DCNETMOD_DEPENDENCY_MODE=vcpkg \
  -DCNETMOD_BUILD_EXAMPLES=ON
cmake --build build-vcpkg --target cnetmod_build_all

On Windows with multiple Visual Studio versions installed, force Visual Studio 2026 with the included overlay triplet:

set VCPKG_ROOT=<path-to-vcpkg>
set VCPKG_VISUAL_STUDIO_PATH=<path-to-Visual-Studio-2026>

:: Optional: move vcpkg caches off the C drive when space is limited.
set X_VCPKG_REGISTRIES_CACHE=%USERPROFILE%\.cache\vcpkg\registries
set VCPKG_DOWNLOADS=%USERPROFILE%\.cache\vcpkg\downloads

%VCPKG_ROOT%\vcpkg.exe install --triplet x64-windows-vs2026 ^
  --overlay-triplets=cmake\vcpkg-triplets

cmake -S . -B build-vcpkg-vs2026 -G"Visual Studio 18 2026" ^
  -DCMAKE_TOOLCHAIN_FILE=%VCPKG_ROOT%/scripts/buildsystems/vcpkg.cmake ^
  -DCNETMOD_DEPENDENCY_MODE=vcpkg ^
  -DVCPKG_TARGET_TRIPLET=x64-windows-vs2026 ^
  -DVCPKG_OVERLAY_TRIPLETS=cmake/vcpkg-triplets

cmake --build build-vcpkg-vs2026 --config Release --target cnetmod_build_all

Choose exactly one dependency mode per build directory. system checks locally installed libraries and falls back to pinned submodules where available; on Linux it prints Arch, Ubuntu, and CentOS installation commands for missing optional libraries. vcpkg and conan require their own toolchain and use package targets for managed dependencies. BoringSSL, Glaze, and the YAML C++23 module facade remain pinned source dependencies in all three modes. Use a fresh build directory when changing modes.

Build with Conan

The repository also includes a Conan 2 recipe:

conan install . --output-folder=build-conan --build=missing \
  -s build_type=Release -s compiler.cppstd=23
cmake --preset conan-default
cmake --build --preset conan-release --target cnetmod_core

For Visual Studio 2026, use Conan 2.30+ and CMake 4.2+ so MSVC 195 and the Visual Studio 18 2026 generator are recognized:

:: Optional: move Conan cache and temp files off the C drive when space is limited.
set CONAN_HOME=%USERPROFILE%\.conan2-vs2026
set TEMP=%USERPROFILE%\.cache\build-tmp
set TMP=%USERPROFILE%\.cache\build-tmp

conan --version
conan install . --output-folder=build-conan-vs2026 --build=missing ^
  -s build_type=Release ^
  -s compiler=msvc -s compiler.version=195 ^
  -s compiler.runtime=dynamic -s compiler.runtime_type=Release ^
  -s compiler.cppstd=23 ^
  -c tools.cmake.cmaketoolchain:generator="Visual Studio 18 2026"

cmake --preset conan-default
cmake --build --preset conan-release --target cnetmod_core

:: Optional: validate recipe export, isolated build, and packaging
conan create . --build=missing -pr:h vs2026 -pr:b vs2026

The default Conan recipe installs the remaining ConanCenter packages such as pugixml, leveldb, openssl, and zlib. JSON is provided through cnetmod.json; the module is intentionally Glaze-only and installs the bundled Glaze headers required by its public module interface. mimalloc is enabled by default and can be disabled with -o cnetmod/*:with_mimalloc=False. stdexec is normally taken from 3rdparty/stdexec; if your Conan remote provides the upstream p2300 package, enable -o cnetmod/*:with_stdexec_package=True.

The build system auto-detects standard library module paths for MSVC and libc++. On Windows, install the latest Visual Studio 2026 and use the default auto-detected MSVC module paths. If detection fails on Linux/macOS, manually specify:

# Linux/macOS with clang
cmake -B build \
  -DLIBCXX_MODULE_DIRS=/usr/lib/llvm-21/share/libc++/v1 \
  -DLIBCXX_INCLUDE_DIRS=/usr/lib/llvm-21/include/c++/v1

Architecture

Module structure: Pure C++23 module interfaces (.cppm) with no headers. Platform-specific implementations in .cpp files selected via CMake.

cnetmod.core          — socket, buffer, address, error, log, dns, ssl, serial_port
cnetmod.coro          — task, spawn, channel, mutex, semaphore, timer, cancel
cnetmod.io            — io_context + platform backends (iocp, io_uring, epoll, kqueue)
cnetmod.executor      — async_op, server_context, coroutine scheduler, CPU-pool bridge
cnetmod.protocol.tcp  — TCP acceptor/connector
cnetmod.protocol.udp  — UDP async I/O
cnetmod.protocol.http — HTTP/1.1 + HTTP/2 + HTTP/3 client/server, router, middleware, and QPACK
cnetmod.protocol.quic — QUIC transport, TLS 1.3, connection migration, multipath, and congestion control
cnetmod.protocol.websocket — WebSocket server
cnetmod.protocol.socks5 — SOCKS5 proxy client + server
cnetmod.protocol.mqtt — MQTT broker + client (v3.1.1 / v5.0)
cnetmod.protocol.kafka — Kafka producer, consumer groups, offsets, idempotence, transactions
cnetmod.protocol.amqp091 — AMQP 0-9-1 / RabbitMQ client, channels, confirms, recovery
cnetmod.protocol.amqp10 — AMQP 1.0 client, sessions, links, flow control, settlement
cnetmod.protocol.mysql — MySQL async client + ORM
cnetmod.protocol.redis — Redis async client
cnetmod.protocol.raft — Raft replicated state machine, storage, transport, runtime, membership, snapshots
cnetmod.protocol.modbus — Modbus TCP/UDP/RTU client + server
cnetmod.protocol.coap — CoAP UDP client + server, datagram codec, resource router
cnetmod.protocol.openai — OpenAI API client
cnetmod.protocol.http.middleware.*  — HTTP middleware components
cnetmod.utils         — Protocol conversion utilities (endian, CRC, hex, register conversion)

Scheduler/executor: io_context provides post(coroutine_handle<>) for thread-safe task submission. Platform-specific wake() implementations:

  • Windows: PostQueuedCompletionStatus with sentinel key
  • Linux io_uring: Non-blocking pipe + io_uring read
  • Linux epoll: eventfd drain trigger
  • macOS kqueue: pipe drain trigger

Coroutine primitives: task<T> uses symmetric transfer for tail-call optimization. spawn() bridges eager coroutines to the scheduler via detached_task.

Async operations: RAII-based async_op base class with platform-specific overlap/submission tracking. Completion callbacks resume awaiting coroutines via post().

Design Rationale

Why modules? Zero-cost header-free build model. Reduced compile times and cleaner API surface. Aligns with C++23 standard library direction.

Why coroutines? Zero-overhead async/await without callback hell. Stackless coroutines compile to state machines with optimal performance.

Why io_uring/IOCP/kqueue? Platform-native async I/O delivers best performance. io_uring avoids syscall overhead. IOCP is battle-tested for Windows servers. kqueue is the only option for macOS.

Why a private executor backend? cnetmod exposes only its own coroutine APIs (task, io_scheduler, task_group, and blocking_invoke). The current CPU-pool implementation may use stdexec internally in ordinary .cpp files, but no sender/receiver or third-party executor type crosses a public module boundary.

Project Status

cnetmod is a modern C++23 network library showcasing the power of modules and coroutines. It provides production-grade implementations of HTTP/1.1, HTTP/2, HTTP/3, MQTT, MySQL, WebSocket, Modbus, CoAP, and more, all built with zero-overhead async/await.

The library demonstrates that C++23 modules are ready for real-world use, with full cross-platform support on Linux, macOS, and Windows.

License

MIT License. See LICENSE file for details.

About

Modern C++23 Modules asynchronous network library, cross-platform, stackless coroutine

Topics

Resources

Stars

6 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages