74 lines
1.7 KiB
V
74 lines
1.7 KiB
V
import os
|
|
import os.notify
|
|
import net
|
|
import time
|
|
|
|
// This example demonstrates a single threaded TCP server using os.notify to be
|
|
// notified of events on file descriptors. You can connect to the server using
|
|
// netcat in separate shells, for example: `nc localhost 9001`
|
|
|
|
fn main() {
|
|
$if !linux {
|
|
eprintln('This example only works on Linux')
|
|
exit(1)
|
|
}
|
|
|
|
// create TCP listener
|
|
mut listener := net.listen_tcp(.ip, 'localhost:9001') ?
|
|
defer {
|
|
listener.close() or {}
|
|
}
|
|
addr := listener.addr() ?
|
|
eprintln('Listening on $addr')
|
|
eprintln('Type `stop` to stop the server')
|
|
|
|
// create file descriptor notifier
|
|
mut notifier := notify.new() ?
|
|
defer {
|
|
notifier.close() or {}
|
|
}
|
|
notifier.add(os.stdin().fd, .read) ?
|
|
notifier.add(listener.sock.handle, .read) ?
|
|
|
|
for {
|
|
for event in notifier.wait(time.infinite) {
|
|
match event.fd {
|
|
listener.sock.handle {
|
|
// someone is trying to connect
|
|
eprint('trying to connect.. ')
|
|
if conn := listener.accept() {
|
|
if _ := notifier.add(conn.sock.handle, .read | .peer_hangup) {
|
|
eprintln('connected')
|
|
} else {
|
|
eprintln('error adding to notifier: $err')
|
|
}
|
|
} else {
|
|
eprintln('unable to accept: $err')
|
|
}
|
|
}
|
|
0 {
|
|
// stdin
|
|
s, _ := os.fd_read(event.fd, 10)
|
|
if s == 'stop\n' {
|
|
eprintln('stopping')
|
|
return
|
|
}
|
|
}
|
|
else {
|
|
// remote connection
|
|
if event.kind.has(.peer_hangup) {
|
|
if _ := notifier.remove(event.fd) {
|
|
eprintln('remote disconnected')
|
|
} else {
|
|
eprintln('error removing from notifier: $err')
|
|
}
|
|
} else {
|
|
s, _ := os.fd_read(event.fd, 10)
|
|
os.fd_write(event.fd, s)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|