Skip to content

TCP Local ​

Local TCP listener/client round trip over loopback with httpx.tcp.

zig
const std = @import("std");
const httpx = @import("httpx");

pub fn main() !void {
    const io = std.Io.Threaded.global_single_threaded.io();

    var holder = httpx.Address{ .family = .ip4, .port = 0 };
    var addr = try holder.parseIp("127.0.0.1");
    addr.port = 0;
    var listener = try httpx.tcp.Listener.bindAddress(io, &addr);
    defer listener.close(io);
    const port = listener.localPort();

    const ServerCtx = struct {
        listener: *httpx.tcp.Listener,
        io: std.Io,
    };
    const Th = struct {
        fn run(ctx: *ServerCtx) void {
            var accepted = ctx.listener.accept(ctx.io) catch return;
            defer accepted.close();
            var inBuf: [64]u8 = undefined;
            const n = accepted.read(&inBuf) catch return;
            if (std.mem.eql(u8, inBuf[0..n], "ping")) {
                accepted.writeAll("pong") catch return;
            }
        }
    };
    var ctx = ServerCtx{ .listener = &listener, .io = io };
    const thread = try std.Thread.spawn(.{}, Th.run, .{&ctx});
    defer thread.join();

    var client = try httpx.tcp.connectAddress(io, &addr);
    defer client.close();
    try client.writeAll("ping");
    var outBuf: [64]u8 = undefined;
    const n = try client.read(&outBuf);
    std.debug.print("got: {s}\n", .{outBuf[0..n]});
}

Released under the MIT License.