mirror of
https://git.robbyzambito.me/zaprus
synced 2025-12-21 00:34:50 +00:00
This commit is contained in:
@@ -14,9 +14,10 @@ pub fn deinit() void {
|
||||
network.deinit();
|
||||
}
|
||||
|
||||
fn broadcastSaprusMessage(msg: SaprusMessage, udp_port: u16, allocator: Allocator) !void {
|
||||
const msg_bytes = try msg.toBytes(allocator);
|
||||
defer allocator.free(msg_bytes);
|
||||
fn broadcastSaprusMessage(msg: *SaprusMessage, udp_port: u16) !void {
|
||||
const msg_bytes = msg.asBytes();
|
||||
try msg.networkFromNativeEndian();
|
||||
defer msg.nativeFromNetworkEndian() catch unreachable;
|
||||
|
||||
var sock = try network.Socket.create(.ipv4, .udp);
|
||||
defer sock.close();
|
||||
@@ -40,14 +41,13 @@ fn broadcastSaprusMessage(msg: SaprusMessage, udp_port: u16, allocator: Allocato
|
||||
}
|
||||
|
||||
pub fn sendRelay(payload: []const u8, dest: [4]u8, allocator: Allocator) !void {
|
||||
const msg = SaprusMessage{
|
||||
.relay = .{
|
||||
.header = .{ .dest = dest },
|
||||
.payload = payload,
|
||||
},
|
||||
};
|
||||
const msg: *SaprusMessage = try .init(allocator, .relay, @intCast(payload.len));
|
||||
defer msg.deinit(allocator);
|
||||
const relay = (try msg.getSaprusTypePayload()).relay;
|
||||
relay.dest = dest;
|
||||
@memcpy(relay.getPayload(), payload);
|
||||
|
||||
try broadcastSaprusMessage(msg, 8888, allocator);
|
||||
try broadcastSaprusMessage(msg, 8888);
|
||||
}
|
||||
|
||||
fn randomPort() u16 {
|
||||
@@ -59,26 +59,25 @@ 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, allocator: Allocator) !*SaprusMessage {
|
||||
const dest_port = randomPort();
|
||||
const msg = SaprusMessage{
|
||||
.connection = .{
|
||||
.header = .{
|
||||
.src_port = initial_port,
|
||||
.dest_port = dest_port,
|
||||
},
|
||||
.payload = payload,
|
||||
},
|
||||
};
|
||||
const msg: *SaprusMessage = try .init(allocator, .connection, @intCast(payload.len));
|
||||
defer msg.deinit(allocator);
|
||||
const connection = (try msg.getSaprusTypePayload()).connection;
|
||||
connection.src_port = initial_port;
|
||||
connection.dest_port = dest_port;
|
||||
@memcpy(connection.getPayload(), payload);
|
||||
|
||||
try broadcastSaprusMessage(msg, 8888, allocator);
|
||||
try broadcastSaprusMessage(msg, 8888);
|
||||
|
||||
return msg;
|
||||
}
|
||||
|
||||
pub fn connect(payload: []const u8, allocator: Allocator) !?SaprusConnection {
|
||||
var foo: gcat.nic.RawSocket = try .init("enp7s0"); // /proc/net/dev
|
||||
defer foo.deinit();
|
||||
if (false) {
|
||||
var foo: gcat.nic.RawSocket = try .init("enp7s0"); // /proc/net/dev
|
||||
defer foo.deinit();
|
||||
}
|
||||
|
||||
var initial_port: u16 = 0;
|
||||
if (rand) |r| {
|
||||
@@ -86,7 +85,7 @@ pub fn connect(payload: []const u8, allocator: Allocator) !?SaprusConnection {
|
||||
} else unreachable;
|
||||
|
||||
var initial_conn_res: ?SaprusMessage = null;
|
||||
errdefer if (initial_conn_res) |c| c.deinit(allocator);
|
||||
errdefer if (initial_conn_res) |*c| c.deinit(allocator);
|
||||
|
||||
var sock = try network.Socket.create(.ipv4, .udp);
|
||||
defer sock.close();
|
||||
@@ -103,14 +102,15 @@ pub fn connect(payload: []const u8, allocator: Allocator) !?SaprusConnection {
|
||||
|
||||
const msg = try sendInitialConnection(payload, initial_port, allocator);
|
||||
|
||||
var response_buf: [4096]u8 = undefined;
|
||||
var response_buf: [4096]u8 align(4) = @splat(0);
|
||||
_ = try sock.receive(&response_buf); // Ignore message that I sent.
|
||||
const len = try sock.receive(&response_buf);
|
||||
|
||||
initial_conn_res = try SaprusMessage.fromBytes(response_buf[0..len], allocator);
|
||||
std.debug.print("response bytes: {x}\n", .{response_buf});
|
||||
initial_conn_res = (try SaprusMessage.bytesAsValue(response_buf[0..len])).*;
|
||||
|
||||
// Complete handshake after awaiting response
|
||||
try broadcastSaprusMessage(msg, randomPort(), allocator);
|
||||
try broadcastSaprusMessage(msg, randomPort());
|
||||
|
||||
if (false) {
|
||||
return initial_conn_res.?;
|
||||
|
||||
Reference in New Issue
Block a user