#lang racket/base ;; A more different trivial example program demonstrating os2-tcp.rkt. (require racket/string) (require racket/set) (require racket/match) (require "os2.rkt") (require "os2-tcp.rkt") (define ((connection-handler local-addr remote-addr) self-pid) (transition 'no-state (send-tcp-mode remote-addr local-addr 'lines) (send-tcp-credit remote-addr local-addr 1) (role (topic-subscriber (tcp-channel remote-addr local-addr (wild))) [(tcp-channel remote _ (? bytes? line)) (list (send-tcp-credit remote-addr local-addr 1) (send-message (tcp-channel local-addr remote-addr (bytes-append #"You said: " line #"\n"))))] [(tcp-channel remote _ (? eof-object?)) (quit)]))) (define (listener local-addr) (transition 'no-state (role (topic-subscriber (tcp-channel (wild) local-addr (wild)) #:monitor? #t) #:topic t #:on-presence (match t [(topic 'publisher (tcp-channel remote-addr (== local-addr) _) #f) (spawn (connection-handler local-addr remote-addr))])))) (define (main port) (ground-vm (transition 'none (spawn tcp-spy) (spawn tcp-driver) (spawn (listener (tcp-listener port)))))) (main 5999)