socket.zig 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. const std = @import("std");
  2. const net = std.net;
  3. const posix = std.posix;
  4. pub fn setReadTimeout(conn: posix.socket_t, seconds: u32) !void {
  5. const timeout = posix.timeval{
  6. .sec = @intCast(seconds),
  7. .usec = 0,
  8. };
  9. try posix.setsockopt(conn, posix.SOL.SOCKET, posix.SO.RCVTIMEO, &std.mem.toBytes(timeout));
  10. }
  11. pub fn setWriteTimeout(conn: posix.socket_t, seconds: u32) !void {
  12. const timeout = posix.timeval{
  13. .sec = @intCast(seconds),
  14. .usec = 0,
  15. };
  16. try posix.setsockopt(conn, posix.SOL.SOCKET, posix.SO.SNDTIMEO, &std.mem.toBytes(timeout));
  17. }
  18. pub fn init(host: []const u8, port: u16) !posix.socket_t {
  19. const address = try std.net.Address.parseIp(host, port);
  20. const tpe: u32 = posix.SOCK.STREAM;
  21. const protocol = posix.IPPROTO.TCP;
  22. const listener = try posix.socket(address.any.family, tpe, protocol);
  23. try posix.setsockopt(listener, posix.SOL.SOCKET, posix.SO.REUSEADDR, &std.mem.toBytes(@as(c_int, 1)));
  24. try posix.setsockopt(listener, posix.SOL.SOCKET, posix.SO.RCVBUF, &std.mem.toBytes(@as(c_int, 1048576)));
  25. try posix.setsockopt(listener, posix.SOL.SOCKET, posix.SO.SNDBUF, &std.mem.toBytes(@as(c_int, 1048576)));
  26. try posix.bind(listener, &address.any, address.getOsSockLen());
  27. try posix.listen(listener, 1024);
  28. return listener;
  29. }
  30. pub fn initUnix(path: []const u8) !posix.socket_t {
  31. posix.unlink(path) catch {};
  32. const address = try net.Address.initUnix(path);
  33. const listener = try posix.socket(posix.AF.UNIX, posix.SOCK.STREAM, 0);
  34. try posix.bind(listener, &address.any, address.getOsSockLen());
  35. try posix.listen(listener, 1024);
  36. return listener;
  37. }