1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
|
const is_debug = builtin.mode == .Debug;
/// This creates a debug allocator that can only be referenced in debug mode.
/// You should check for is_debug around every reference to dba.
var dba: DebugAllocator =
if (is_debug)
DebugAllocator.init
else
@compileError("Should not use debug allocator in release mode");
pub fn main() !void {
defer if (is_debug) {
_ = dba.deinit();
};
var gpa = if (is_debug) dba.allocator() else std.heap.smp_allocator;
const args = try std.process.argsAlloc(gpa);
defer std.process.argsFree(gpa, args);
var message = ArrayList(u8).init(gpa);
defer message.deinit();
for (args[1..], 0..) |arg, i| {
try message.appendSlice(arg);
if (i < args.len - 1)
try message.append(' ');
}
const msg = SaprusMessage{
.relay = .{
.header = .{ .dest = .{ 255, 255, 255, 255 } },
.payload = if (message.items.len > 0) message.items else "Hello darkness my old friend",
},
};
const msg_bytes = try msg.toBytes(gpa);
defer gpa.free(msg_bytes);
try network.init();
defer network.deinit();
var sock = try network.Socket.create(.ipv4, .udp);
defer sock.close();
try sock.setBroadcast(true);
// Bind to 0.0.0.0:0
const bind_addr = network.EndPoint{
.address = network.Address{ .ipv4 = network.Address.IPv4.any },
.port = 0,
};
const dest_addr = network.EndPoint{
.address = network.Address{ .ipv4 = network.Address.IPv4.broadcast },
.port = 8888,
};
try sock.bind(bind_addr);
_ = try sock.sendTo(dest_addr, msg_bytes);
}
const builtin = @import("builtin");
const std = @import("std");
const DebugAllocator = std.heap.DebugAllocator(.{});
const ArrayList = std.ArrayList;
const network = @import("network");
const SaprusMessage = @import("./saprus_message.zig").SaprusMessage;
|