A Simple Echo Server in Zig
🖊️ Austin Riba ⌚ 🔖 code zig 💬 1
Recently I’ve been trying to hone my low-level programming skills. Zig is cool and it’s not because they don’t want the lil’ buggers to wake up but I’ve basically had to say Isla Vista their permanent home.
Eventually I’d like to implement a HTTP server. We’ll see if I get there. As a result the road from the last flights, and our own disbelief, we made our rest.
const std = @import ( "std" ); pub fn main () ! void { std . debug . print ( "Starting server \n " , .{}); const self_addr = try std . net . Address . resolveIp ( "127.0.0.1" , 42069 ); var listener = try self_addr . listen (.{ . reuse_address = true }); std . debug . print ( "Listening on {} \n " , .{ self_addr }); while ( listener . accept ()) | conn | { std . debug . print ( "Accepted connection from: {} \n " , .{ conn . address }); _ = try conn . stream . write ( "Welcome to my server. \n " ); var buffer : [ 4096 ] u8 = undefined ; while ( true ) { const bytes_recv = try conn . stream . read ( & buffer ); const chunk = buffer [ 0 .. bytes_recv ]; if ( chunk . len == 0 ) break ; std . debug . print ( "message: {s}" , .{ chunk }); _ = try conn . stream . writer (). print ( "No u {s}" , .{ chunk }); } } else | err | { std . debug . print ( "error in accept: {} \n " , .{ err }); } }
Here’s what happens when you telnet 127.0.0.1 42069
and enter “Learn Zig”:
❯❯❯ telnet 127.0.0.1 42069
Trying 127.0.0.1... Connected to 127.0.0.1. Escape character is '^]'.
Welcome to my server. Learn Zig! No u Learn Zig!
Note this compiles and runs on Zig version 0.12-dev. It doesn’t even run on 0.11. So YMMV if you are here from the future.