Compare commits

..

2 Commits

Author SHA1 Message Date
19c2b78d1d Connection by default 2026-01-25 01:14:02 -05:00
3c5f34d5c2 Set timeouts instead of sleeping 2026-01-24 21:14:40 -05:00
3 changed files with 13 additions and 18 deletions

View File

@@ -113,10 +113,9 @@ pub fn connect(self: Client, io: Io, payload: []const u8) !SaprusConnection {
try self.socket.send(full_msg); try self.socket.send(full_msg);
var res_buf: [4096]u8 = undefined; var res_buf: [4096]u8 = undefined;
// Ignore response from sentinel, just accept that we got one.
log.debug("Awaiting handshake response", .{}); log.debug("Awaiting handshake response", .{});
// Ignore response from sentinel, just accept that we got one.
_ = try self.socket.receive(&res_buf); _ = try self.socket.receive(&res_buf);
try io.sleep(.fromMilliseconds(40), .real);
headers.udp.dst_port = udp_dest_port; headers.udp.dst_port = udp_dest_port;
headers.ip.id = rand.int(u16); headers.ip.id = rand.int(u16);

View File

@@ -72,10 +72,6 @@ pub fn init() !RawSocket {
const bind_ret = std.os.linux.bind(socket, @ptrCast(&sockaddr_ll), @sizeOf(@TypeOf(sockaddr_ll))); const bind_ret = std.os.linux.bind(socket, @ptrCast(&sockaddr_ll), @sizeOf(@TypeOf(sockaddr_ll)));
if (bind_ret != 0) return error.BindError; 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 .{ return .{
.fd = socket, .fd = socket,
.sockaddr_ll = sockaddr_ll, .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 { pub fn deinit(self: *RawSocket) void {
_ = std.os.linux.close(self.fd); _ = std.os.linux.close(self.fd);
self.* = undefined; self.* = undefined;

View File

@@ -26,18 +26,15 @@ pub fn main(init: std.process.Init) !void {
const args = try init.minimal.args.toSlice(init.arena.allocator()); const args = try init.minimal.args.toSlice(init.arena.allocator());
if (args.len == 1) {
std.debug.print("{s}", .{help});
return;
}
var flags: struct { var flags: struct {
relay: ?[]const u8 = null, relay: ?[]const u8 = null,
dest: ?[]const u8 = null, dest: ?[]const u8 = null,
connect: ?[]const u8 = null, connect: ?[]const u8 = null,
} = .{}; } = .{};
{ if (args.len == 1) {
flags.connect = "";
} else {
var i: usize = 1; var i: usize = 1;
while (i < args.len) : (i += 1) { while (i < args.len) : (i += 1) {
if (to_option.get(args[i])) |opt| { if (to_option.get(args[i])) |opt| {
@@ -127,8 +124,6 @@ pub fn main(init: std.process.Init) !void {
return; return;
} }
var retry_seconds: u16 = 12 * if (is_debug) 1 else 10;
var init_con_buf: [SaprusClient.max_payload_len]u8 = undefined; var init_con_buf: [SaprusClient.max_payload_len]u8 = undefined;
var w: Writer = .fixed(&init_con_buf); var w: Writer = .fixed(&init_con_buf);
try w.print("{b64}", .{flags.connect.?}); try w.print("{b64}", .{flags.connect.?});
@@ -139,19 +134,18 @@ pub fn main(init: std.process.Init) !void {
defer client.deinit(); defer client.deinit();
log.debug("Starting connection", .{}); log.debug("Starting connection", .{});
try client.socket.setTimeout(if (is_debug) 3 else 25, 0);
var connection = client.connect(init.io, w.buffered()) catch { var connection = client.connect(init.io, w.buffered()) catch {
try init.io.sleep(.fromSeconds(retry_seconds), .boot); log.debug("Connection timed out", .{});
continue; continue;
}; };
retry_seconds = 60 * if (is_debug) 1 else 10;
log.debug("Connection started", .{}); log.debug("Connection started", .{});
next_message: while (true) { next_message: while (true) {
var res_buf: [2048]u8 = undefined; 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 { const next = connection.next(init.io, &res_buf) catch {
try init.io.sleep(.fromSeconds(retry_seconds), .boot);
continue :reconnect; continue :reconnect;
}; };