aboutsummaryrefslogtreecommitdiff
path: root/v_windows/v/examples/tcp_echo_server.v
blob: e5a09732636781ff4c43a4b56703aaaa89754a0c (plain)
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
import io
import net

// This file shows how a basic TCP echo server can be implemented using
// the net module. You can connect to the server by using netcat or telnet,
// in separate shells, for example:
// nc 127.0.0.1 12345
// or
// telnet 127.0.0.1 12345

fn main() {
	mut server := net.listen_tcp(.ip6, ':12345') ?
	laddr := server.addr() ?
	eprintln('Listen on $laddr ...')
	for {
		mut socket := server.accept() ?
		go handle_client(mut socket)
	}
}

fn handle_client(mut socket net.TcpConn) {
	defer {
		socket.close() or { panic(err) }
	}
	client_addr := socket.peer_addr() or { return }
	eprintln('> new client: $client_addr')
	mut reader := io.new_buffered_reader(reader: socket)
	defer {
		reader.free()
	}
	socket.write_string('server: hello\n') or { return }
	for {
		received_line := reader.read_line() or { return }
		if received_line == '' {
			return
		}
		println('client $client_addr: $received_line')
		socket.write_string('server: $received_line\n') or { return }
	}
}