From 213a01afc8407749e31a350c52a5809b5394a918 Mon Sep 17 00:00:00 2001 From: Robby Zambito Date: Tue, 20 Jan 2026 22:41:53 -0500 Subject: Implemented client and connection --- src/Connection.zig | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) (limited to 'src/Connection.zig') diff --git a/src/Connection.zig b/src/Connection.zig index e69de29..503cb6c 100644 --- a/src/Connection.zig +++ b/src/Connection.zig @@ -0,0 +1,59 @@ +socket: RawSocket, +headers: EthIpUdp, +connection: SaprusMessage, + +const Connection = @This(); + +pub fn init(socket: RawSocket, headers: EthIpUdp, connection: SaprusMessage) Connection { + return .{ + .socket = socket, + .headers = headers, + .connection = connection, + }; +} + +pub fn next(self: Connection, io: Io, buf: []u8) ![]const u8 { + _ = io; + const res = try self.socket.receive(buf); + const connection_res = blk: { + const msg: SaprusMessage = try .parse(res[42..]); + break :blk msg.connection; + }; + + return connection_res.payload; +} + +pub fn send(self: *Connection, io: Io, buf: []const u8) !void { + const rand = blk: { + const io_source: std.Random.IoSource = .{ .io = io }; + break :blk io_source.interface(); + }; + + self.connection.connection.payload = buf; + const connection_bytes = blk: { + var connection_bytes: [2048]u8 = undefined; + break :blk self.connection.toBytes(&connection_bytes); + }; + + self.headers.setPayloadLen(connection_bytes.len); + self.headers.ip.id = rand.int(u16); + + const full_msg = blk: { + var msg_buf: [2048]u8 = undefined; + var msg_w: Writer = .fixed(&msg_buf); + try msg_w.writeAll(&self.headers.toBytes()); + try msg_w.writeAll(connection_bytes); + break :blk msg_w.buffered(); + }; + + try self.socket.send(full_msg); +} + +const std = @import("std"); +const Io = std.Io; +const Writer = std.Io.Writer; + +const SaprusMessage = @import("./message.zig").Message; + +const EthIpUdp = @import("./EthIpUdp.zig").EthIpUdp; +const RawSocket = @import("./RawSocket.zig"); -- cgit