(use http-client packedobjects tcp posix) (define MAX-PDU-SIZE 5000) (define protocol '(random choice (query sequence (num integer (range 1 10000)) (min integer (range -1000000000 1000000000)) (max integer (range -1000000000 1000000000))) (response sequence-of (n integer (range -1000000000 1000000000))))) (define data (packedobjects protocol pdusize: MAX-PDU-SIZE)) (define l (tcp-listen 4242)) (define-values (i o) (tcp-accept l)) (define fdin (port->fileno i)) (define fdout (port->fileno o)) (define (rndnums num min max) (string-split (http:GET (format "http://www.random.org/cgi-bin/randnum?num=~a&min=~a&max=~a&col=1" num min max)))) (define (decode-query t) (define (get-var v l) (cadr (assq v (cdadr l)))) (values (get-var 'num t) (get-var 'min t) (get-var 'max t))) (let wait-for-data () (unless (file-select fdin #f 0) (wait-for-data))) (unless (> (data 'read-message fdin) 0) (error "connection lost!")) (define-values (num min max) (decode-query (data 'unpack))) (define nums (rndnums num min max)) ;; use for testing ;;(define nums '("1" "2" "3" "4" "5")) (define (response alon) (list 'random (cons 'response (map (lambda (v) (list (list 'n (string->number v)))) alon)))) (define pdu (response nums)) (print* "packing: " pdu "\n") (data 'write-message fdout (data 'pack pdu)) (data 'free) (close-input-port i) (close-output-port o)