Sample code for 30+ languages & platforms
Zig

Receive an Exact Number of Bytes into a BinData

See more Socket/SSL/TLS Examples

Demonstrates Socket.ReceiveBdN, which receives exactly the requested number of bytes and appends them to a BinData, continuing until the full count is satisfied.

Background. Inactivity is controlled by MaxReadIdleMs: the call fails if incoming bytes halt for longer than MaxReadIdleMs milliseconds before the full amount is received. A single receive returns only what is currently available, whereas this counted receive waits for an exact number of bytes.

Chilkat Zig Downloads

Zig
const std = @import("std");
const chilkat = @import("chilkat");

pub fn main(init: std.process.Init) !void {
    const alloc = init.arena.allocator();

    const socket = try chilkat.Socket.init();
    defer socket.deinit();

    // Connect to the server using TLS.
    const b_tls = true;
    const max_wait_ms = 5000;
    socket.connect("example.com", 5000, b_tls, max_wait_ms) catch {
        std.debug.print("{s}\n", .{try socket.getLastErrorText(alloc)});
        return;
    };

    // MaxReadIdleMs controls the inactivity limit for receiving.  The ReceiveBdN call will fail if
    // incoming bytes halt for longer than this many milliseconds before the full amount is received.
    socket.setMaxReadIdleMs(15000);

    // Receive exactly the requested number of bytes, appending them to a BinData.  The method continues
    // receiving until the full count is satisfied or a failure occurs.
    const bd = try chilkat.BinData.init();
    defer bd.deinit();
    socket.receiveBdN(256, bd) catch {
        std.debug.print("{s}\n", .{try socket.getLastErrorText(alloc)});
        return;
    };

    std.debug.print("Received {d} bytes.\n", .{bd.getNumBytes()});
}