123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102 |
- const std = @import("std");
- const c = @cImport({
- @cInclude("sys/socket.h");
- @cInclude("sys/un.h");
- @cInclude("unistd.h");
- });
- const SOCKET_PATH = "/tmp/socktest.sock";
- pub fn main() !void{
- std.fs.deleteFileAbsolute(SOCKET_PATH) catch {}; // delete old if exists
-
- const sock = c.socket(c.AF_UNIX, c.SOCK_STREAM, 0); // create new TCP sock, Unix domain (TCP-like)
- if(sock == -1){
- std.debug.print("failed to create socket\n", .{});
- return error.SocketCreateFailed;
- }
- defer _ = c.close(sock);
-
- var addr: c.struct_sockaddr_un = undefined;
- addr.sun_family = c.AF_UNIX;
-
- if(SOCKET_PATH.len >= addr.sun_path.len){
- return error.SocketPathTooLong;
- }
- @memcpy(addr.sun_path[0..SOCKET_PATH.len], SOCKET_PATH);
- addr.sun_path[SOCKET_PATH.len] = 0;
-
- if(c.bind(sock, @ptrCast(&addr), @sizeOf(c.struct_sockaddr_un)) == -1){
- std.debug.print("failed to bind socket\n", .{});
- return error.SocketBindFailed;
- }
-
- if(c.listen(sock, 1) == -1){
- std.debug.print("failed to listen socket\n", .{});
- return error.SocketListenFailed;
- }
-
- std.debug.print("Zig server is listening {s}\n", .{SOCKET_PATH});
-
- while(true){
- const client_fd = c.accept(sock, null, null);
- if(client_fd == -1){
- std.debug.print("accept error\n", .{});
- continue;
- }
-
- std.debug.print("client connected\n", .{});
-
- const file = std.fs.File{ .handle = @intCast(client_fd) };
- const in_stream = file.reader();
- const out_stream = file.writer();
-
- var buffer: [256]u8 = undefined;
- const n_bytes = in_stream.read(&buffer) catch |err|{ // read msg
- std.debug.print("read msg err: {any}\n", .{err});
- _ = c.close(client_fd);
- continue;
- };
-
- const msg = buffer[0..n_bytes];
- std.debug.print("receive msg: {s}\n", .{msg});
-
-
- // process msg
- var reply_buffer: [128]u8 = undefined;
- var fbs = std.io.fixedBufferStream(&reply_buffer);
- var writer = fbs.writer();
-
- if(std.mem.eql(u8, msg, "hello")){
- try writer.print("Hello World (by Zig) !", .{});
-
- }else if(std.mem.startsWith(u8, msg, "factorial ")){
- const num_str = msg["factorial ".len..];
- if(std.fmt.parseInt(usize, num_str, 10)) |num|{
-
- if(num > 34){ // max n for max factorial for u128
- try writer.print("error: input too large, max is 34", .{});
- }else{
- var fact: u128 = 1;
- var i = num;
- while(i > 1) : (i -= 1){ fact *= i; }
- try writer.print("factorial({d}) = {d}", .{ num, fact });
- }
-
- }else |_|{
- try writer.print("error: invalid number", .{});
- }
-
- }else{
- try writer.print("unknown command", .{});
- }
-
- _ = try out_stream.write(fbs.getWritten()); // send responce
- _ = c.close(client_fd);
- }
- }
|