Advertisement
Guest User

Untitled

a guest
Apr 26th, 2020
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.88 KB | None | 0 0
  1. const std = @import("std");
  2.  
  3. pub const io_mode = .evented;
  4.  
  5. const allocator = std.heap.page_allocator;
  6.  
  7. pub fn main() anyerror!void {
  8. var server = std.net.StreamServer.init(.{});
  9. defer server.deinit();
  10.  
  11. try server.listen(std.net.Address.parseIp("127.0.0.1", 1883) catch unreachable);
  12. std.debug.warn("Listening at {}\n", .{server.listen_address});
  13.  
  14. while (true) {
  15. const client = try allocator.create(Client);
  16. client.* = Client{
  17. .conn = try server.accept(),
  18. .handle_frame = async client.handle(),
  19. };
  20. }
  21. }
  22.  
  23. const Client = struct {
  24. conn: std.net.StreamServer.Connection,
  25. handle_frame: @Frame(handle),
  26.  
  27. fn handle(self: *Client) !void {
  28. // Close connection once we are donw with it
  29. defer self.conn.file.close();
  30.  
  31. // Open TCP socket towards MQTT borker
  32. const brokerSocket = try std.net.tcpConnectToAddress(std.net.Address.parseIp("127.0.0.1", 1884) catch unreachable);
  33. defer brokerSocket.close();
  34.  
  35. // Read from MQTT client and write to MQTT broker
  36. var c2b = async pipe(self.conn.file, brokerSocket);
  37.  
  38. // Read from MQTT broker and write to MQTT client
  39. var b2c = async pipe(brokerSocket, self.conn.file);
  40.  
  41. // Wait to finish
  42. try await c2b;
  43. try await b2c;
  44. }
  45. };
  46.  
  47. fn pipe(in: std.fs.File, out: std.fs.File) !void {
  48. std.debug.warn("HELLO\n", .{});
  49.  
  50. var buf: [256]u8 = undefined;
  51. var len: usize = 0;
  52. while (true) {
  53. std.debug.warn("Enter while\n", .{});
  54. len = try in.readAll(&buf);
  55.  
  56. std.debug.warn("Read len = {}\n", .{len});
  57.  
  58. try out.writeAll(buf[0..len]);
  59.  
  60. std.debug.warn("Wrote stuff\n", .{});
  61.  
  62. if (len < buf.len) {
  63. std.debug.warn("len = {}, buf.len = {}", .{len, buf.len});
  64. break;
  65. }
  66. }
  67. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement