diff options
Diffstat (limited to 'src/saprus.zig')
-rw-r--r-- | src/saprus.zig | 54 |
1 files changed, 51 insertions, 3 deletions
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; |