summaryrefslogtreecommitdiff
path: root/src/Client.zig
diff options
context:
space:
mode:
Diffstat (limited to 'src/Client.zig')
-rw-r--r--src/Client.zig50
1 files changed, 19 insertions, 31 deletions
diff --git a/src/Client.zig b/src/Client.zig
index f1786e8..8e4ced4 100644
--- a/src/Client.zig
+++ b/src/Client.zig
@@ -3,6 +3,8 @@ const base64Dec = std.base64.Base64Decoder.init(std.base64.standard_alphabet_cha
var rand: ?Random = null;
+const max_message_size = 2048;
+
pub fn init() !void {
var prng = Random.DefaultPrng.init(blk: {
var seed: u64 = undefined;
@@ -47,16 +49,12 @@ fn broadcastSaprusMessage(msg: *SaprusMessage, udp_port: u16) !void {
_ = try sock.sendTo(dest_addr, msg_bytes);
}
-pub fn sendRelay(payload: []const u8, dest: [4]u8, allocator: Allocator) !void {
- const msg_bytes = try allocator.alignedAlloc(
- u8,
- @alignOf(SaprusMessage),
- try SaprusMessage.lengthForPayloadLength(
- .relay,
- base64Enc.calcSize(payload.len),
- ),
- );
- defer allocator.free(msg_bytes);
+pub fn sendRelay(payload: []const u8, dest: [4]u8) !void {
+ var buf: [max_message_size]u8 align(@alignOf(SaprusMessage)) = undefined;
+ const msg_bytes = buf[0..try SaprusMessage.calcSize(
+ .relay,
+ base64Enc.calcSize(payload.len),
+ )];
const msg: *SaprusMessage = .init(.relay, msg_bytes);
const relay = (try msg.getSaprusTypePayload()).relay;
@@ -75,18 +73,14 @@ fn randomPort() u16 {
return p;
}
-pub fn sendInitialConnection(payload: []const u8, initial_port: u16, allocator: Allocator) !*SaprusMessage {
+pub fn sendInitialConnection(payload: []const u8, initial_port: u16) !*SaprusMessage {
const dest_port = randomPort();
- const msg_bytes = try allocator.alignedAlloc(
- u8,
- @alignOf(SaprusMessage),
- try SaprusMessage.lengthForPayloadLength(
- .connection,
- base64Enc.calcSize(payload.len),
- ),
- );
-
- const msg: *SaprusMessage = .init(.connection, msg_bytes);
+ var buf: [max_message_size]u8 align(@alignOf(SaprusMessage)) = undefined;
+ const msg_bytes = buf[0..try SaprusMessage.calcSize(
+ .connection,
+ base64Enc.calcSize(payload.len),
+ )];
+ const msg: *SaprusMessage = .init(.relay, msg_bytes);
const connection = (try msg.getSaprusTypePayload()).connection;
connection.src_port = initial_port;
@@ -98,11 +92,8 @@ pub fn sendInitialConnection(payload: []const u8, initial_port: u16, allocator:
return msg;
}
-pub fn connect(payload: []const u8, allocator: Allocator) !?SaprusConnection {
- var initial_port: u16 = 0;
- if (rand) |r| {
- initial_port = r.intRangeAtMost(u16, 1024, 65000);
- } else unreachable;
+pub fn connect(payload: []const u8) !?SaprusConnection {
+ const initial_port = randomPort();
var initial_conn_res: ?*SaprusMessage = null;
@@ -119,10 +110,9 @@ pub fn connect(payload: []const u8, allocator: Allocator) !?SaprusConnection {
try sock.setReadTimeout(1 * std.time.us_per_s);
try sock.bind(bind_addr);
- const msg = try sendInitialConnection(payload, initial_port, allocator);
- defer allocator.free(msg.asBytes());
+ const msg = try sendInitialConnection(payload, initial_port);
- var response_buf: [4096]u8 align(@alignOf(SaprusMessage)) = undefined;
+ var response_buf: [max_message_size]u8 align(@alignOf(SaprusMessage)) = undefined;
_ = try sock.receive(&response_buf); // Ignore message that I sent.
const len = try sock.receive(&response_buf);
@@ -148,5 +138,3 @@ const mem = std.mem;
const network = @import("network");
const gcat = @import("gatorcat");
-
-const Allocator = mem.Allocator;