summaryrefslogtreecommitdiff
path: root/racket/chat.rkt
diff options
context:
space:
mode:
Diffstat (limited to 'racket/chat.rkt')
-rw-r--r--racket/chat.rkt35
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