2012-07-12 17:25:35 +00:00
|
|
|
#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)
|
2012-07-23 19:21:30 +00:00
|
|
|
(role (topic-subscriber (tcp-channel remote-addr local-addr (wild)))
|
2012-07-12 17:25:35 +00:00
|
|
|
[(tcp-channel remote _ (? bytes? bs))
|
2012-07-23 21:21:12 +00:00
|
|
|
(list (send-tcp-credit remote-addr local-addr 16)
|
|
|
|
(send-message (tcp-channel local-addr remote-addr bs)))]
|
2012-07-12 17:25:35 +00:00
|
|
|
[(tcp-channel remote _ (? eof-object?))
|
2012-07-23 21:21:12 +00:00
|
|
|
(kill)]))
|
2012-07-12 17:25:35 +00:00
|
|
|
|
|
|
|
(transition 'no-state
|
|
|
|
(send-tcp-credit remote-addr local-addr 16)
|
|
|
|
(reader-role)))
|
|
|
|
|
|
|
|
(define (listener local-addr)
|
|
|
|
(transition 'no-state
|
2012-07-23 19:21:30 +00:00
|
|
|
(role (topic-subscriber (tcp-channel (wild) local-addr (wild)) #:monitor? #t)
|
2012-07-12 17:25:35 +00:00
|
|
|
#:topic t
|
|
|
|
#:on-presence (match t
|
|
|
|
[(topic 'publisher (tcp-channel remote-addr (== local-addr) _) #f)
|
2012-07-23 21:21:12 +00:00
|
|
|
(spawn (connection-handler local-addr remote-addr))]))))
|
2012-07-12 17:25:35 +00:00
|
|
|
|
|
|
|
(define (main port)
|
|
|
|
(define (arm-timer)
|
2012-07-23 19:21:30 +00:00
|
|
|
(role (topic-subscriber (timer-expired (wild) (wild)))
|
|
|
|
#:name 'waiter
|
2012-07-23 21:21:12 +00:00
|
|
|
#:on-presence (send-message (set-timer 'label 500 'relative))
|
|
|
|
[(timer-expired _ _) (list (delete-role 'waiter)
|
|
|
|
(arm-timer))]))
|
2012-07-12 17:25:35 +00:00
|
|
|
(ground-vm
|
|
|
|
(transition 'none
|
|
|
|
(spawn tcp-spy)
|
|
|
|
(spawn tcp-driver)
|
|
|
|
(spawn timer-driver)
|
|
|
|
(arm-timer)
|
|
|
|
(spawn (listener (tcp-listener port))))))
|
|
|
|
|
|
|
|
(main 5999)
|