v / examples
Raw file | 73 loc (68 sloc) | 1.67 KB | Latest commit hash 017ace6ea
1import os
2import os.notify
3import net
4import time
5
6// This example demonstrates a single threaded TCP server using os.notify to be
7// notified of events on file descriptors. You can connect to the server using
8// netcat in separate shells, for example: `nc localhost 9001`
9
10fn main() {
11 $if !linux {
12 eprintln('This example only works on Linux')
13 exit(1)
14 }
15
16 // create TCP listener
17 mut listener := net.listen_tcp(.ip, 'localhost:9001')!
18 defer {
19 listener.close() or {}
20 }
21 addr := listener.addr()!
22 eprintln('Listening on ${addr}')
23 eprintln('Type `stop` to stop the server')
24
25 // create file descriptor notifier
26 mut notifier := notify.new()!
27 defer {
28 notifier.close() or {}
29 }
30 notifier.add(os.stdin().fd, .read)!
31 notifier.add(listener.sock.handle, .read)!
32
33 for {
34 for event in notifier.wait(time.infinite) {
35 match event.fd {
36 listener.sock.handle {
37 // someone is trying to connect
38 eprint('trying to connect.. ')
39 if conn := listener.accept() {
40 notifier.add(conn.sock.handle, .read | .peer_hangup) or {
41 eprintln('error adding to notifier: ${err}')
42 return
43 }
44 eprintln('connected')
45 } else {
46 eprintln('unable to accept: ${err}')
47 }
48 }
49 0 {
50 // stdin
51 s, _ := os.fd_read(event.fd, 10)
52 if s == 'stop\n' {
53 eprintln('stopping')
54 return
55 }
56 }
57 else {
58 // remote connection
59 if event.kind.has(.peer_hangup) {
60 notifier.remove(event.fd) or {
61 eprintln('error removing from notifier: ${err}')
62 return
63 }
64 eprintln('remote disconnected')
65 } else {
66 s, _ := os.fd_read(event.fd, 10)
67 os.fd_write(event.fd, s)
68 }
69 }
70 }
71 }
72 }
73}