os2-tcp-test-bytewise-echo.rkt from 4 July 2012

This commit is contained in:
Tony Garnock-Jones 2012-07-12 13:25:35 -04:00
parent 8fd2328532
commit 7d2d701507
1 changed files with 51 additions and 0 deletions

View File

@ -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)