racket-matrix-2012/os2-tcp-test-echo-service.rkt

38 lines
1.2 KiB
Racket
Raw Normal View History

2012-05-11 19:28:48 +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-tcp.rkt")
(define ((connection-handler local-addr remote-addr) self-pid)
(transition 'no-state
(send-tcp-mode remote-addr local-addr 'lines)
(send-tcp-credit remote-addr local-addr 1)
(role (topic-subscriber (tcp-channel remote-addr local-addr (wild)))
2012-05-11 19:28:48 +00:00
[(tcp-channel remote _ (? bytes? line))
(list (send-tcp-credit remote-addr local-addr 1)
(send-message
(tcp-channel local-addr remote-addr (bytes-append #"You said: " line #"\n"))))]
2012-05-11 19:28:48 +00:00
[(tcp-channel remote _ (? eof-object?))
2012-08-13 20:49:24 +00:00
(quit)])))
2012-05-11 19:28:48 +00:00
(define (listener local-addr)
(transition 'no-state
(role (topic-subscriber (tcp-channel (wild) local-addr (wild)) #:monitor? #t)
2012-05-11 19:28:48 +00:00
#:topic t
#:on-presence (match t
[(topic 'publisher (tcp-channel remote-addr (== local-addr) _) #f)
(spawn (connection-handler local-addr remote-addr))]))))
2012-05-11 19:28:48 +00:00
(define (main port)
(ground-vm
(transition 'none
(spawn tcp-spy)
(spawn tcp-driver)
(spawn (listener (tcp-listener port))))))
(main 5999)