Skip to content

Instantly share code, notes, and snippets.

@tetsu-koba
Last active December 19, 2022 12:43
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tetsu-koba/84cf0c1e9d7b041278e7d9b5a92c3b3d to your computer and use it in GitHub Desktop.
Save tetsu-koba/84cf0c1e9d7b041278e7d9b5a92c3b3d to your computer and use it in GitHub Desktop.
TCP socket example of Zig language
TCP connection examples in Zig language
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)
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);
}
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