1package main
2
3import "core:fmt"
4import "core:net"
5import "core:os"
6
7udp_echo_client :: proc(ip: string, port: int) {
8 local_addr, ok := net.parse_ip4_address(ip)
9 if !ok {
10 fmt.println("Failed to parse IP address")
11 return
12 }
13 server_endpoint := net.Endpoint {
14 address = local_addr,
15 port = port,
16 }
17
18
19 sock, err := net.make_unbound_udp_socket(net.family_from_address(local_addr))
20 if err != nil {
21 fmt.println("Failed to make unbound UDP socket", err)
22 return
23 }
24 fmt.println("Client is ready")
25 buffer: [256]u8
26 for {
27 fmt.print("> ")
28 n, err_read := os.read(os.stdin, buffer[:])
29 if err_read != nil {
30 fmt.println("Failed to read data", err_read)
31 break
32 }
33 data := buffer[:n]
34 if n == 0 || is_eol(data) {
35 break
36 }
37 bytes_sent, err_send := net.send_udp(sock, data, server_endpoint)
38 if err_send != nil {
39 fmt.println("Failed to send data", err_send)
40 break
41 }
42 sent := data[:bytes_sent]
43 fmt.printfln("Client sent [ %d bytes ]: %s", len(sent), sent)
44 bytes_recv, _, err_recv := net.recv_udp(sock, buffer[:])
45 if err_recv != nil {
46 fmt.println("Failed to receive data", err_recv)
47 break
48 }
49 received := buffer[:bytes_recv]
50 fmt.printfln("Client received [ %d bytes ]: %s", len(received), received)
51 }
52 net.close(sock)
53 fmt.println("Closed socket")
54}
55
56main :: proc() {
57 udp_echo_client("127.0.0.1", 8080)
58}
59
60is_lf :: proc(bytes : []u8) -> bool {
61 return len(bytes) == 1 && bytes[0] == '\n'
62}
63
64is_crlf :: proc(bytes : []u8) -> bool {
65 return len(bytes) == 2 && bytes[0] == '\r' && bytes[1] == '\n'
66}
67
68is_eol :: proc(bytes : []u8) -> bool {
69 return is_lf(bytes) || is_crlf(bytes)
70}