racket-dns-2012/experiments/sfclient.rkt

43 lines
1.1 KiB
Racket

#lang racket/base
(require "os-big-bang.rkt")
(require "os-udp.rkt")
(require "os-timer.rkt" racket/match)
(define getter
(os-big-bang 'none
(send-message `(request create-echo-socket (udp new 0 65536)))
(subscribe/fresh sub
(message-handlers w
[`(reply create-echo-socket ,sname)
(transition w
(unsubscribe sub)
(send-message (udp-packet sname (udp-address "127.0.0.1" 5678) #"get"))
(send-message (set-timer 'timeout 500 #t))
(subscribe 'reply-waiter
(message-handlers w
[(udp-packet source (== sname) reply-bytes)
(define counter (integer-bytes->integer reply-bytes #f))
(write counter)
(newline)
(transition w
(send-message 'quit)
(unsubscribe 'reply-waiter))]
[(timer-expired 'timeout _)
(write 'timed-out)
(newline)
(transition w
(send-message 'quit)
(unsubscribe 'reply-waiter))])))]))))
(ground-vm
(os-big-bang 'none
(spawn (os-big-bang 'none
(subscribe 'quit-waiter
(message-handlers w
['quit
(exit)]))))
(spawn udp-driver)
(spawn (timer-driver))
(spawn getter)))