aboutsummaryrefslogtreecommitdiff
path: root/v_windows/v/examples/tcp_notify_echo_server.v
diff options
context:
space:
mode:
Diffstat (limited to 'v_windows/v/examples/tcp_notify_echo_server.v')
-rw-r--r--v_windows/v/examples/tcp_notify_echo_server.v73
1 files changed, 73 insertions, 0 deletions
diff --git a/v_windows/v/examples/tcp_notify_echo_server.v b/v_windows/v/examples/tcp_notify_echo_server.v
new file mode 100644
index 0000000..0e2d0bf
--- /dev/null
+++ b/v_windows/v/examples/tcp_notify_echo_server.v
@@ -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)
+ }
+ }
+ }
+ }
+ }
+}