forked from zigbyexample/zigbyexample.github.io
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtcp-connection.md
67 lines (47 loc) · 1.57 KB
/
tcp-connection.md
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
---
layout: default
title: TCP Connection
nav_order: 7
permalink: /tcp_connection
---
[tcp-connection.zig](src/tcp-connection.zig)
```zig
const std = @import("std");
const client_msg = "Hello";
const server_msg = "Good Bye";
const Server = struct {
stream_server: std.net.StreamServer,
pub fn init() !Server {
const address = std.net.Address.initIp4([4]u8{ 127, 0, 0, 1 }, 8080);
var server = std.net.StreamServer.init(.{ .reuse_address = true });
try server.listen(address);
return Server{ .stream_server = server };
}
pub fn deinit(self: *Server) void {
self.stream_server.deinit();
}
pub fn accept(self: *Server) !void {
const conn = try self.stream_server.accept();
defer conn.stream.close();
var buf: [1024]u8 = undefined;
const msg_size = try conn.stream.read(buf[0..]);
try std.testing.expectEqualStrings(client_msg, buf[0..msg_size]);
_ = try conn.stream.write(server_msg);
}
};
fn sendMsgToServer(server_address: std.net.Address) !void {
const conn = try std.net.tcpConnectToAddress(server_address);
defer conn.close();
_ = try conn.write(client_msg);
var buf: [1024]u8 = undefined;
const resp_size = try conn.read(buf[0..]);
try std.testing.expectEqualStrings(server_msg, buf[0..resp_size]);
}
test {
var server = try Server.init();
defer server.deinit();
const client_thread = try std.Thread.spawn(.{}, sendMsgToServer, .{server.stream_server.listen_address});
defer client_thread.join();
try server.accept();
}
```