examples: add TCP echo server using os.notify (#10481)
parent
2f35aad8ce
commit
d56219a986
|
@ -0,0 +1,73 @@
|
||||||
|
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)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue