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