const std = @import("std");
const posix = std.posix;
const eprint = std.debug.print;
pub fn tcp_listen(ip: u32, port: u16) !posix.socket_t {
const serverfd = try posix.socket(posix.AF.INET, posix.SOCK.STREAM, 0);
errdefer posix.close(serverfd);
//try posix.setsockopt(serverfd, posix.SOL.SOCKET, posix.SO.REUSEADDR, &[_]u8{1});
var addr: posix.sockaddr.in = .{ .addr = ip, .port = port };
try posix.bind(serverfd, @ptrCast(&addr), @sizeOf(@TypeOf(addr)));
try posix.listen(serverfd, 32);
return serverfd;
}
pub fn handle(clientfd: posix.socket_t) !void {
var buff: [2046]u8 = undefined;
_ = try posix.write(clientfd, "Hello, World !\n");
const len = try posix.read(clientfd, &buff);
if (buff[len - 1] == '\n') {
eprint("=> {s}", .{buff[0..len]});
} else {
eprint("=> {s}\n", .{buff[0..len]});
}
}
pub fn main() void {
const ip: [4]u8 = .{ 127, 0, 0, 1 };
const port: u16 = 8080;
const serverfd = tcp_listen(@byteSwap(@as(u32, @bitCast(ip))), port) catch |err| {
eprint("tcp_listen(): {s}\n", .{@errorName(err)});
posix.exit(1);
};
defer posix.close(serverfd);
while (true) {
var caddr: posix.sockaddr.in = undefined;
var caddrlen: u32 = undefined;
const clientfd = posix.accept(serverfd, @ptrCast(&caddr), &caddrlen, 0) catch |err| {
eprint("accept(): {s}\n", .{@errorName(err)});
continue;
};
handle(clientfd) catch continue;
}
}
I am getting an AddressNotAvailable, and when I try the setsockopt, I get a unreachable error because errno is set to INVAL, what am I doing wrong ?