Skip to content

TCP Configuration

The client and server examples provide complete startup, messaging and shutdown programs. Apply configuration before starting the relevant endpoint unless stated otherwise.

Choose a Receive Policy

For a line protocol, start each receiver with '\n' and send the terminator:

server.start("127.0.0.1", 7000, '\n');
client.start("127.0.0.1", 7000, '\n');
client.async_send(std::string("command\n"));

The callback includes \n. Multi-byte delimiters and custom Asio match conditions are also accepted. Delimiters describe reads; they are not automatically added by async_send. Without a receive policy, accumulate bytes in application storage and parse all complete messages, retaining any unfinished suffix. With use_dgram, do not add the length prefix yourself.

Configure a receive maximum with the constructor tcp_client(initial_bytes, maximum_bytes, workers) or the equivalent server constructor. A peer that never finishes a message must not be allowed to grow the buffer without a bound. Set session idle limits with set_silence_timeout.

Sending, Reconnect and Errors

Configure listeners and limits before start.

Use client async_start(host, port, options...) to begin connecting without waiting. Its return value reports initiation; read the final result in bind_connect through get_last_error() and send only after success.

This fragment belongs before the client’s start call:

client.set_connect_timeout(std::chrono::seconds(10));
client.set_auto_reconnect(true, std::chrono::seconds(1));
client.set_max_send_buffer_size(1024 * 1024);
client.bind_disconnect([]
{
    std::cerr << arknet::get_last_error().message() << '\n';
});
client.async_send(std::string("request"),
    [](const arknet::error_code& error, std::size_t bytes)
    {
        if (error)
            std::cerr << error.message() << '\n';
        else
            std::cout << "written: " << bytes << '\n';
    });

Completions may instead accept (bytes) or (), but these signatures omit the error argument. asio::use_future returns std::future<std::pair<arknet::error_code, std::size_t>>; wait only outside IO callbacks. Immediate rejection may invoke a completion on the submitting thread before async_send returns. Accepted operations complete on the object’s IO lane. Use the completion’s error argument; get_last_error() is thread-local.

The default send queue permits 16 MiB of payload and at most 1024 operations per object. Admission failures report no_buffer_space. Observe queued payload with get_queued_send_buffer_size() and pause producers when the queue is full. Do not spin-retry in an IO callback. Old sends are not replayed after reconnect; use application IDs and acknowledgments when a request may need a retry.

Custom Sessions and External IO

class peer_session : public arknet::tcp_session_t<peer_session>
{
public:
    using arknet::tcp_session_t<peer_session>::tcp_session_t;
    std::string user_id;
};

arknet::tcp_server_t<peer_session> server;

Keep session state on its IO lane or synchronize accesses from other lanes. Copy a received view before retaining it or sending it to a CPU executor. async_send(bytes) in the receive callback already owns the accepted payload.

For an external scheduler, construct a client or server with asio::io_context&. Start its runners and retain a work guard before a blocking start call. A server constructed with one context has one shared lane. Multiple entries in std::vector<asio::io_context*> provide independent serialized lanes, even if they point to one context. See IO models for complete rules.

Call stop() or wait_stopped() on the owner thread while the external context still runs. In an IO callback, call request_stop() and arrange for the owner thread to wait later. wait_stopped() rejects IO-worker calls. Stop and destroy network objects before releasing the work guard and joining the host runners.

See lifecycle tests, TCP tests and performance.

Navigation

Type to search…

↑↓ navigate↵ selectEsc close