diff --git a/zig-impl/src/receive-msg.zig b/zig-impl/src/receive-msg.zig new file mode 100644 index 0000000..ffec16b --- /dev/null +++ b/zig-impl/src/receive-msg.zig @@ -0,0 +1,49 @@ +const std = @import("std"); +const testing = std.testing; +const net = std.net; +const fmt = std.fmt; +const mem = std.mem; +const print = std.debug.print; + +fn disconnect(stream: *net.StreamServer) void { stream.close(); } + +fn server_init() net.StreamServer { + // no reuse_address and default kernel_backlog + return net.StreamServer.init(.{}); +} + +fn waiting_for_connection(stream: *net.StreamServer + , path: []const u8) !net.StreamServer.Connection { + var address = try net.Address.initUnix(path); + try stream.listen(address); + return stream.accept(); +} + +fn receive_msg(stream: net.Stream) !void { + var buffer: [1000]u8 = undefined; + var fbs = std.io.fixedBufferStream(&buffer); + var reader = fbs.reader(); + + var size = try stream.read(buffer[0..]); + print ("Received a message! Read {} bytes\n", .{size}); + + const msg_type = try reader.readByte(); + const msg_len = try reader.readIntBig(u32); + const msg_payload = buffer[4..size]; + print ("type: {}, len {}, content: {s}\n" + , .{msg_type, msg_len, msg_payload}); +} + +pub fn main() !u8 { + var path = "/tmp/.TEST_USOCK"; + print("Init UNIX server to {s}...\n", .{path}); + var stream = server_init(); + print("Waiting for a connection...\n", .{}); + var connection = try waiting_for_connection(&stream, path); + print("Someone is connected! Receiving a message...\n", .{}); + try receive_msg(connection.stream); + print("Disconnection...\n", .{}); + disconnect(&stream); + print("Disconnected!\n", .{}); + return 0; +} diff --git a/zig-impl/src/send-msg.zig b/zig-impl/src/send-msg.zig new file mode 100644 index 0000000..49af8f0 --- /dev/null +++ b/zig-impl/src/send-msg.zig @@ -0,0 +1,38 @@ +const std = @import("std"); +const testing = std.testing; +const net = std.net; +const fmt = std.fmt; +const mem = std.mem; +const print = std.debug.print; + +fn disconnect(stream: net.Stream) void { stream.close(); } + +fn connect(path: []const u8) !net.Stream { + return try net.connectUnixSocket(path); +} + +fn send_msg(stream: net.Stream) !usize { + var buffer: [1000]u8 = undefined; + var fbs = std.io.fixedBufferStream(&buffer); + var writer = fbs.writer(); + + try writer.writeByte(1); // DATA + + const message = "hello everyone"; + try writer.writeIntBig(u32, message.len); + _ = try writer.write(message); + + return stream.write (fbs.getWritten()); +} + +pub fn main() !u8 { + var path = "/tmp/.TEST_USOCK"; + print("Connection to {s}...\n", .{path}); + var stream = try connect(path); + print("Connected! Sending a message...\n", .{}); + const bytecount = try send_msg(stream); + print("Sent {} bytes! Disconnection...\n", .{bytecount}); + disconnect(stream); + print("Disconnected!\n", .{}); + return 0; +}