diff options
author | Robby Zambito <contact@robbyzambito.me> | 2025-04-05 21:22:43 -0400 |
---|---|---|
committer | Robby Zambito <contact@robbyzambito.me> | 2025-04-06 13:08:09 -0400 |
commit | b219fdc1f54f5789a3debfc26ebcd73d624e5792 (patch) | |
tree | f73273a329872227fb16bd0dbbc6aeb2855dc2e8 /src | |
parent | 433a97fe5a973157f9cd9f62f0a62ad1a951b0c9 (diff) |
Start proper connection handshake
Diffstat (limited to 'src')
-rw-r--r-- | src/main.zig | 4 | ||||
-rw-r--r-- | src/saprus.zig | 54 |
2 files changed, 54 insertions, 4 deletions
diff --git a/src/main.zig b/src/main.zig index f43f2bd..3959f08 100644 --- a/src/main.zig +++ b/src/main.zig @@ -30,7 +30,9 @@ pub fn main() !void { try Saprus.init(); defer Saprus.deinit(); - try Saprus.sendInitialConnection(if (message.items.len > 0) message.items else "Hello darkness my old friend", 6868, gpa); + // _ = try Saprus.sendInitialConnection(if (message.items.len > 0) message.items else "Hello darkness my old friend", 6868, gpa); + + try Saprus.connect(if (message.items.len > 0) message.items else "Hello darkness my old friend", gpa); // try Saprus.sendRelay(if (message.items.len > 0) message.items else "Hello darkness my old friend", gpa); } diff --git a/src/saprus.zig b/src/saprus.zig index fce3dc7..b29a381 100644 --- a/src/saprus.zig +++ b/src/saprus.zig @@ -1,4 +1,12 @@ +var rand: ?Random = null; + pub fn init() !void { + var prng = Random.DefaultPrng.init(blk: { + var seed: u64 = undefined; + try posix.getrandom(mem.asBytes(&seed)); + break :blk seed; + }); + rand = prng.random(); try network.init(); } @@ -42,12 +50,17 @@ pub fn sendRelay(payload: []const u8, allocator: Allocator) !void { try broadcastSaprusMessage(msg, allocator); } -pub fn sendInitialConnection(payload: []const u8, initial_port: u16, allocator: Allocator) !void { +pub fn sendInitialConnection(payload: []const u8, initial_port: u16, allocator: Allocator) !SaprusMessage { + var dest_port: u16 = 0; + if (rand) |r| { + dest_port = r.intRangeAtMost(u16, 1024, 65000); + } else unreachable; + const msg = SaprusMessage{ .connection = .{ .header = .{ .src_port = initial_port, - .dest_port = 6868, + .dest_port = dest_port, .seq_num = 1, .msg_id = 2, .reserved = 5, @@ -57,10 +70,45 @@ pub fn sendInitialConnection(payload: []const u8, initial_port: u16, allocator: }; try broadcastSaprusMessage(msg, allocator); + + return msg; +} + +fn awaitSentinelConnectionResponse(res: *?SaprusMessage) !void { + res.* = SaprusMessage{ + .relay = .{ + .header = .{ + .dest = .{ 255, 255, 255, 255 }, + }, + .payload = "", + }, + }; + std.Thread.sleep(3 * 1000 * 1000 * 1000); +} + +pub fn connect(payload: []const u8, allocator: Allocator) !void { + var initial_port: u16 = 0; + if (rand) |r| { + initial_port = r.intRangeAtMost(u16, 1024, 65000); + } else unreachable; + + var initial_conn_res: ?SaprusMessage = null; + const response_thread = try std.Thread.spawn(.{}, awaitSentinelConnectionResponse, .{&initial_conn_res}); + + const msg = try sendInitialConnection(payload, initial_port, allocator); + std.debug.print("msg: {any}\n", .{msg}); + + response_thread.join(); + std.debug.print("initial_conn_res: {any}\n", .{initial_conn_res}); } const SaprusMessage = @import("./saprus_message.zig").SaprusMessage; + const std = @import("std"); +const Random = std.Random; +const posix = std.posix; +const mem = std.mem; + const network = @import("network"); -const Allocator = std.mem.Allocator; +const Allocator = mem.Allocator; |