From 7d2d70150787790ab03f8e3af1386b3d8ffc1659 Mon Sep 17 00:00:00 2001 From: Tony Garnock-Jones Date: Thu, 12 Jul 2012 13:25:35 -0400 Subject: [PATCH] os2-tcp-test-bytewise-echo.rkt from 4 July 2012 --- os2-tcp-test-bytewise-echo.rkt | 51 ++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 os2-tcp-test-bytewise-echo.rkt 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)