net/udp_echo_server/client

Code

client.odin ¶
70 linesSource

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	// for the client, we create an *unbound* UDP socket,
18	// the socket will be bound to a free port when we attempt to send data
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}

Declarations Used 12