summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRobby Zambito <contact@robbyzambito.me>2026-01-24 20:56:37 -0500
committerRobby Zambito <contact@robbyzambito.me>2026-01-24 21:14:40 -0500
commit3c5f34d5c2dafb4829becada1f0c6fb09d33ea79 (patch)
treeade87c1e088c7d3b2292a09dcbc148ff6134f967 /src
parent09152377ed537c9b262e6b0a66a8ce88ca2619ad (diff)
Set timeouts instead of sleeping
Diffstat (limited to 'src')
-rw-r--r--src/Client.zig3
-rw-r--r--src/RawSocket.zig10
-rw-r--r--src/main.zig9
3 files changed, 10 insertions, 12 deletions
diff --git a/src/Client.zig b/src/Client.zig
index e68ef4b..ae9ca66 100644
--- a/src/Client.zig
+++ b/src/Client.zig
@@ -113,10 +113,9 @@ pub fn connect(self: Client, io: Io, payload: []const u8) !SaprusConnection {
try self.socket.send(full_msg);
var res_buf: [4096]u8 = undefined;
- // Ignore response from sentinel, just accept that we got one.
log.debug("Awaiting handshake response", .{});
+ // Ignore response from sentinel, just accept that we got one.
_ = try self.socket.receive(&res_buf);
- try io.sleep(.fromMilliseconds(40), .real);
headers.udp.dst_port = udp_dest_port;
headers.ip.id = rand.int(u16);
diff --git a/src/RawSocket.zig b/src/RawSocket.zig
index f790e4e..71b4e1c 100644
--- a/src/RawSocket.zig
+++ b/src/RawSocket.zig
@@ -72,10 +72,6 @@ pub fn init() !RawSocket {
const bind_ret = std.os.linux.bind(socket, @ptrCast(&sockaddr_ll), @sizeOf(@TypeOf(sockaddr_ll)));
if (bind_ret != 0) return error.BindError;
- const timeout: std.os.linux.timeval = .{ .sec = 60 * if (is_debug) 1 else 10, .usec = 0 };
- const timeout_ret = std.os.linux.setsockopt(socket, std.os.linux.SOL.SOCKET, std.os.linux.SO.RCVTIMEO, @ptrCast(&timeout), @sizeOf(@TypeOf(timeout)));
- if (timeout_ret != 0) return error.SetTimeoutError;
-
return .{
.fd = socket,
.sockaddr_ll = sockaddr_ll,
@@ -83,6 +79,12 @@ pub fn init() !RawSocket {
};
}
+pub fn setTimeout(self: *RawSocket, sec: isize, usec: i64) !void {
+ const timeout: std.os.linux.timeval = .{ .sec = sec, .usec = usec };
+ const timeout_ret = std.os.linux.setsockopt(self.fd, std.os.linux.SOL.SOCKET, std.os.linux.SO.RCVTIMEO, @ptrCast(&timeout), @sizeOf(@TypeOf(timeout)));
+ if (timeout_ret != 0) return error.SetTimeoutError;
+}
+
pub fn deinit(self: *RawSocket) void {
_ = std.os.linux.close(self.fd);
self.* = undefined;
diff --git a/src/main.zig b/src/main.zig
index 708ad18..439dc93 100644
--- a/src/main.zig
+++ b/src/main.zig
@@ -127,8 +127,6 @@ pub fn main(init: std.process.Init) !void {
return;
}
- var retry_seconds: u16 = 12 * if (is_debug) 1 else 10;
-
var init_con_buf: [SaprusClient.max_payload_len]u8 = undefined;
var w: Writer = .fixed(&init_con_buf);
try w.print("{b64}", .{flags.connect.?});
@@ -139,19 +137,18 @@ pub fn main(init: std.process.Init) !void {
defer client.deinit();
log.debug("Starting connection", .{});
+ try client.socket.setTimeout(if (is_debug) 3 else 25, 0);
var connection = client.connect(init.io, w.buffered()) catch {
- try init.io.sleep(.fromSeconds(retry_seconds), .boot);
+ log.debug("Connection timed out", .{});
continue;
};
- retry_seconds = 60 * if (is_debug) 1 else 10;
-
log.debug("Connection started", .{});
next_message: while (true) {
var res_buf: [2048]u8 = undefined;
+ try client.socket.setTimeout(if (is_debug) 60 else 600, 0);
const next = connection.next(init.io, &res_buf) catch {
- try init.io.sleep(.fromSeconds(retry_seconds), .boot);
continue :reconnect;
};