From d626ed178720532f67af77bbfd7f6b00c3805fa4 Mon Sep 17 00:00:00 2001 From: cozis Date: Sat, 30 May 2026 15:58:44 +0200 Subject: [PATCH] examples: Add tcp_ping_pong.zig to test various networking I/O functions --- examples/tcp_ping_pong.zig | 76 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 examples/tcp_ping_pong.zig diff --git a/examples/tcp_ping_pong.zig b/examples/tcp_ping_pong.zig new file mode 100644 index 0000000..e654249 --- /dev/null +++ b/examples/tcp_ping_pong.zig @@ -0,0 +1,76 @@ +const std = @import("std"); +const Io = std.Io; +const net = Io.net; + +const Simulator = @import("zigmulator"); + +const server_ip = net.Ip4Address.loopback(8080); +const server_address: net.IpAddress = .{ .ip4 = server_ip }; + +fn serverProgram(init: std.process.Init) anyerror!void { + var stdout = Io.File.stdout().writerStreaming(init.io, &.{}); + + var server = try server_address.listen(init.io, .{}); + defer server.deinit(init.io); + + var stream = try server.accept(init.io); + defer stream.close(init.io); + + try stdout.interface.writeAll("server: accepted connection on 127.0.0.1:8080\n"); + try stdout.interface.flush(); + + var reader_buffer: [16]u8 = undefined; + var reader = stream.reader(init.io, &reader_buffer); + var request: [4]u8 = undefined; + try reader.interface.readSliceAll(&request); + + try stdout.interface.print("server: received {s}\n", .{&request}); + try stdout.interface.flush(); + + var writer_buffer: [16]u8 = undefined; + var writer = stream.writer(init.io, &writer_buffer); + try writer.interface.writeAll("pong"); + try writer.interface.flush(); +} + +fn clientProgram(init: std.process.Init) anyerror!void { + var stdout = Io.File.stdout().writerStreaming(init.io, &.{}); + + var stream = try server_address.connect(init.io, .{ .mode = .stream }); + defer stream.close(init.io); + + var writer_buffer: [16]u8 = undefined; + var writer = stream.writer(init.io, &writer_buffer); + try writer.interface.writeAll("ping"); + try writer.interface.flush(); + + try stdout.interface.writeAll("client: sent ping\n"); + try stdout.interface.flush(); + + // Give the server a deterministic scheduling point to read and respond. + try Io.sleep(init.io, .fromMilliseconds(1), .awake); + + var reader_buffer: [16]u8 = undefined; + var reader = stream.reader(init.io, &reader_buffer); + var response: [4]u8 = undefined; + try reader.interface.readSliceAll(&response); + + try stdout.interface.print("client: received {s}\n", .{&response}); + try stdout.interface.flush(); +} + +pub fn main(init: std.process.Init) !void { + const server_addresses = [_]u32{std.mem.readInt(u32, &server_ip.bytes, .big)}; + + var sim: Simulator = undefined; + sim.init(std.heap.page_allocator, init.io); + defer sim.deinit(); + + try sim.addExecutable("server", serverProgram); + try sim.addExecutable("client", clientProgram); + + try sim.spawn("server", .{ .addresses = &server_addresses }); + try sim.spawn("client", .{}); + + while (sim.scheduleOne()) {} +}