diff --git a/os2-tcp-test-bytewise-echo.rkt b/os2-tcp-test-bytewise-echo.rkt new file mode 100644 index 0000000..4708bcc --- /dev/null +++ b/os2-tcp-test-bytewise-echo.rkt @@ -0,0 +1,51 @@ +#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-timer.rkt") +(require "os2-tcp.rkt") + +(define ((connection-handler local-addr remote-addr) self-pid) + (define (reader-role) + (role 'echoer (topic-subscriber (tcp-channel remote-addr local-addr (wild))) + #:state state + [(tcp-channel remote _ (? bytes? bs)) + (transition state + (send-tcp-credit remote-addr local-addr 16) + (send-message (tcp-channel local-addr remote-addr bs)))] + [(tcp-channel remote _ (? eof-object?)) + (transition state + (kill))])) + + (transition 'no-state + (send-tcp-credit remote-addr local-addr 16) + (reader-role))) + +(define (listener local-addr) + (transition 'no-state + (role 'inbound-handler (topic-subscriber (tcp-channel (wild) local-addr (wild)) #:monitor? #t) + #:state state + #:topic t + #:on-presence (match t + [(topic 'publisher (tcp-channel remote-addr (== local-addr) _) #f) + (transition state (spawn (connection-handler local-addr remote-addr)))])))) + +(define (main port) + (define (arm-timer) + (role 'waiter (topic-subscriber (timer-expired (wild) (wild))) + #:state state + #:on-presence (transition state (send-message (set-timer 'label 500 'relative))) + [(timer-expired _ _) + (transition state (delete-role 'waiter) (arm-timer))])) + (ground-vm + (transition 'none + (spawn tcp-spy) + (spawn tcp-driver) + (spawn timer-driver) + (arm-timer) + (spawn (listener (tcp-listener port)))))) + +(main 5999)