Skip to content

Instantly share code, notes, and snippets.

@aka-mj
Created June 26, 2025 12:52
Show Gist options
  • Select an option

  • Save aka-mj/3490d3a8b918a45db20528ec5d60310a to your computer and use it in GitHub Desktop.

Select an option

Save aka-mj/3490d3a8b918a45db20528ec5d60310a to your computer and use it in GitHub Desktop.
CAN Socket in Zig
const std = @import("std");
const c = @cImport({
@cInclude("linux/can.h");
});
const page_allocator = std.heap.page_allocator;
const Allocator = std.mem.Allocator;
const can_frame = extern struct {
can_id: u32,
len: u8,
pad: u8 = 0,
res0: u8 = 0,
len8_dlc: u8 = 0,
data: [8]u8 = [8]u8{ 0, 0, 0, 0, 0, 0, 0, 0 },
};
pub fn main() !void {
var s = std.os.socket(std.os.AF.CAN, std.os.SOCK.RAW, 1) catch |err| return err;
var idx = std.c.if_nametoindex("can0");
var sa: c.sockaddr_can = undefined;
@memset(@ptrCast([*]u8, &sa)[0..@sizeOf(c.sockaddr_can)], 0);
sa.can_family = std.os.AF.CAN;
sa.can_ifindex = idx;
try std.os.bind(s, @ptrCast(*std.os.linux.sockaddr, &sa), @sizeOf(c.sockaddr_can));
var frame = can_frame{
.can_id = 0x1000D101 | (@as(u32, 1) << 31),
.len = 2,
};
frame.data[0] = 0xAA;
frame.data[1] = 0xBB;
_ = try std.os.write(s, @ptrCast([*]const u8, &frame)[0..@sizeOf(can_frame)]);
// -or-
_ = try std.os.write(s, std.mem.asBytes(&frame));
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment