Last active
December 19, 2022 12:43
-
-
Save tetsu-koba/84cf0c1e9d7b041278e7d9b5a92c3b3d to your computer and use it in GitHub Desktop.
TCP socket example of Zig language
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
TCP connection examples in Zig language |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
EXES = tcp_server tcp_client | |
all: $(EXES) | |
tcp_server: tcp_server.zig | |
zig build-exe $< | |
tcp_client: tcp_client.zig | |
zig build-exe $< | |
clean: | |
rm -rf *.o $(EXES) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
const std = @import("std"); | |
const os = std.os; | |
const log = std.log; | |
const time = std.time; | |
const net = std.net; | |
const BUFSIZE = 1024; | |
fn helloToServer(adr: []const u8, port: u16, verbose:bool) !void { | |
const a = try net.Address.resolveIp(adr, port); | |
var s = try net.tcpConnectToAddress(a); | |
defer s.close(); | |
if (verbose) { | |
log.info("{d}:Connected.", .{time.milliTimestamp()}); | |
} | |
const bytes_write = try s.write("Hello from client."); | |
if (verbose) { | |
log.info("{d}:bytes_write={d}", .{time.milliTimestamp(),bytes_write}); | |
} | |
var buf: [BUFSIZE]u8 = .{}; | |
const bytes_read = try s.read(buf[0..]); | |
if (verbose) { | |
log.info("{d}:Got message [{s}].", .{time.milliTimestamp(),buf[0..bytes_read]}); | |
} | |
} | |
pub fn main() !void { | |
// TODO: get parameters from command line options | |
const verbose = true; | |
const adr = "127.0.0.1"; | |
const port = 8201; | |
try helloToServer(adr, port, verbose); | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
const std = @import("std"); | |
const os = std.os; | |
const log = std.log; | |
const time = std.time; | |
const net = std.net; | |
const BUFSIZE = 1024; | |
pub fn handleConn(conn: net.StreamServer.Connection, verbose:bool) !void { | |
if (verbose) { | |
log.info("{d}:Accepted connection from {s}.", .{time.milliTimestamp(), conn.address}); | |
} | |
var buf: [BUFSIZE]u8 = .{}; | |
const s = &conn.stream; | |
defer s.close(); | |
const bytes_read = try s.read(buf[0..]); | |
if (verbose) { | |
log.info("{d}:Got message [{s}].", .{time.milliTimestamp(),buf[0..bytes_read]}); | |
} | |
const bytes_write = try s.write("Hello from server."); | |
if (verbose) { | |
log.info("{d}:bytes_write={d}", .{time.milliTimestamp(),bytes_write}); | |
} | |
} | |
pub fn serverLoop(port: u16, verbose:bool) !void { | |
const opt: net.StreamServer.Options = .{.reuse_address = true}; | |
var s = net.StreamServer.init(opt); | |
defer s.deinit(); | |
const adr = try net.Address.resolveIp("0.0.0.0", port); | |
try s.listen(adr); | |
defer s.close(); | |
if (verbose) { | |
log.info("{d}:Listening on {}", .{time.milliTimestamp(), adr}); | |
} | |
while (s.accept()) |conn| { | |
try handleConn(conn, verbose); | |
} else |err| { | |
return err; | |
} | |
} | |
pub fn main() !void { | |
// TODO: get parameters from command line options | |
const verbose = true; | |
const port = 8201; | |
try serverLoop(port, verbose); | |
} | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment