Logo

index : blog

---

  • summary
  • about
  • tree
  • log
  • branches
<< path: root/public/blog.git/html/tests/backend_socket.jai blob: 8bb85784082e2a1722bd39e47e285fc86604307a [raw] [clear marker]

        
0
1
2
3Disruption_Kind :: enum_flags {
4 NONE;
5 CONNECT;
6 SEND;
7 CANCEL;
8}
9
10Disruption :: struct {
11 delay: s32;
12 kind: Disruption_Kind;
13}
14
15
16socket_dispatch :: (args: Args, is_set: Is_Set) {
17 disruption := disruption_make(args, is_set);
18
19 code_connect :: #code { disruption_dispatch(disruption, .CONNECT); };
20 code_send :: #code { disruption_dispatch(disruption, .SEND); };
21
22 socket_send_message(
23 "Hello from Jai!\n",
24 disruption,
25 code_connect,
26 code_send
27 );
28}
29
30test__socket_send_message :: #procedure_of_call socket_send_message("A");
31
32
33#scope_file
34
35
36#import "Socket";
37#import "POSIX";
38
39
40TIMEOUT_SEC :: 2;
41NO_YAP :: true;
42
43
44yap :: inline (msg: string, args: ..Any) {
45 #if !NO_YAP then log(msg, ..args);
46}
47
48socket_send_message :: inline (message: string) {
49 socket_send_message(message, {}, #code {}, #code {});
50}
51
52socket_send_message :: (
53 message: string, disruption: Disruption, $code_connect: Code, $code_send: Code
54) {
55 socket_init();
56
57 tv := timeval.{
58 tv_sec = TIMEOUT_SEC,
59 tv_usec = 0
60 };
61
62 sock := socket(AF_INET, .STREAM, 0);
63 defer close_and_reset(*sock);
64 assert(sock > 0, "Socket");
65
66 server_addr: sockaddr_in;
67 server_addr.sin_family = AF_INET;
68 server_addr.sin_port = htons(PORT);
69 server_addr.sin_addr.s_addr = inet_addr(HOST);
70
71 setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, *tv, size_of(type_of(tv)));
72 setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, *tv, size_of(type_of(tv)));
73
74 result := connect(sock, cast(*sockaddr, *server_addr), size_of(type_of(server_addr)));
75 if result != 0 {
76 log_error("No connection");
77 return;
78 }
79
80 #insert,scope() code_connect;
81
82 yap("Connected to %:%", HOST, PORT);
83
84 bytes_sent := send(sock, message.data, xx message.count, 0);
85 assert(bytes_sent >= 0, "Failed to send message");
86
87 #insert,scope() code_send;
88
89 yap("Sent % bytes\n", bytes_sent);
90
91 buffer: [1024] u8;
92 bytes_received := recv(sock, buffer.data, buffer.count, 0);
93
94 if bytes_received > 0 {
95 response := string.{ xx bytes_received, buffer.data };
96 print("Server response: %\n", response);
97 }
98}
99
100disruption_make :: (args: Args, is_set: Is_Set) -> Disruption {
101 d: Disruption;
102 d.delay = args.delay;
103
104 if is_set.connect then d.kind |= .CONNECT;
105 if is_set.send then d.kind |= .SEND;
106 if is_set.cancel then d.kind |= .CANCEL;
107
108 return d;
109}
110
111disruption_dispatch :: (d: Disruption, $post_what: Disruption_Kind) #expand {
112 if (d.kind & post_what == 0) return;
113
114 yap("-- Mode: % ------------", post_what);
115
116 if (d.delay > 0) then yap("Sleeping for % ms", d.delay);
117 sleep_milliseconds(d.delay);
118
119 if d.kind & .CANCEL != 0 {
120 yap("Early return");
121 `return;
122 }
123}
124
125
Copyright 2026  E766CB298A6D1E64 | Git-Thing heavily inspired by cgit