examples: Add tcp_ping_pong.zig to test various networking I/O functions
This commit is contained in:
@@ -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()) {}
|
||||
}
|
||||
Reference in New Issue
Block a user