2
0

socket.zig 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. const std = @import("std");
  2. const net = std.net;
  3. const posix = std.posix;
  4. pub fn init(port: u16) !posix.socket_t {
  5. const address = try std.net.Address.parseIp("0.0.0.0", port);
  6. const tpe: u32 = posix.SOCK.STREAM;
  7. const protocol = posix.IPPROTO.TCP;
  8. const listener = try posix.socket(address.any.family, tpe, protocol);
  9. try posix.setsockopt(listener, posix.SOL.SOCKET, posix.SO.REUSEADDR, &std.mem.toBytes(@as(c_int, 1)));
  10. try posix.setsockopt(listener, posix.SOL.SOCKET, posix.SO.RCVBUF, &std.mem.toBytes(@as(c_int, 1048576))); // 1MB receive buffer
  11. try posix.setsockopt(listener, posix.SOL.SOCKET, posix.SO.SNDBUF, &std.mem.toBytes(@as(c_int, 1048576))); // 1MB send buffer
  12. try posix.bind(listener, &address.any, address.getOsSockLen());
  13. try posix.listen(listener, 1024); // Increased backlog
  14. return listener;
  15. }
  16. pub fn readUntilCR(conn: posix.socket_t, buf: []u8) !usize {
  17. var total: usize = 0;
  18. while (total < buf.len) {
  19. const n = try posix.read(conn, buf[total..]);
  20. if (n == 0) {
  21. return if (total > 0) total else error.ConnectionClosed;
  22. }
  23. if (std.mem.indexOfScalar(u8, buf[total .. total + n], '\r')) |offset| {
  24. return total + offset;
  25. }
  26. total += n;
  27. }
  28. return total;
  29. }
  30. pub fn read(conn: posix.socket_t, buf: []u8) !usize {
  31. var pos: usize = 0;
  32. while (pos < buf.len) {
  33. const n = try posix.read(conn, buf[pos..]);
  34. if (n == 0) {
  35. return pos;
  36. }
  37. pos += n;
  38. }
  39. return pos;
  40. }
  41. pub fn write(conn: posix.socket_t, msg: []const u8) !void {
  42. const written = try posix.write(conn, msg);
  43. if (written != msg.len) {
  44. return error.PartialWrite;
  45. }
  46. }
  47. pub fn writev(conn: posix.socket_t, iovecs: []const posix.iovec_const) !void {
  48. var total: usize = 0;
  49. for (iovecs) |iov| {
  50. total += iov.len;
  51. }
  52. const written = try posix.writev(conn, iovecs);
  53. if (written != total) {
  54. return error.PartialWrite;
  55. }
  56. }