diff options
Diffstat (limited to 'racket/chat.rkt')
| -rw-r--r-- | racket/chat.rkt | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/racket/chat.rkt b/racket/chat.rkt new file mode 100644 index 0000000..012fe62 --- /dev/null +++ b/racket/chat.rkt @@ -0,0 +1,35 @@ +#lang racket +(require racket/tcp) + +(define outs '()) + +(define (write-all data out) + (for-each + (lambda (o) + (cond [(not (eq? o out)) (displayln data o)])) + outs)) + +(define (worker in out) + (define (loop msg) + (if (equal? msg eof) + (begin (close-input-port in) + (close-output-port out) + (set! outs (remove out outs))) + (let ([data (read-line in)]) + (displayln data) + (write-all (string-append ">>> " data) out) + (loop data)))) + (loop 'y)) + +(define (listener sock) + (define-values (in-conn out-conn) (tcp-accept sock)) + (file-stream-buffer-mode in-conn 'none) + (file-stream-buffer-mode out-conn 'none) + (thread (lambda () (worker in-conn out-conn))) + (set! outs (cons out-conn outs)) + (writeln (length outs)) + (listener sock)) + +(define sock (tcp-listen 1678 4 #t)) +(listener sock) +(tcp-close sock)
\ No newline at end of file |