chibi-scheme/examples/echo-server.scm

38 lines
1.1 KiB
Scheme

(import (scheme) (srfi 18) (chibi net) (chibi io) (chibi filesystem))
;; Copy each input line to output.
(define (echo-handler in out)
(let ((line (read-line in)))
(cond
((not (eof-object? line))
(display line out)
(newline out)
(flush-output out)
(echo-handler in out)))))
;; Run a handler in a separate thread on the input and output ports,
;; then cleanup.
(define (run-io-handler sock handler)
(let ((in (open-input-file-descriptor sock))
(out (open-output-file-descriptor sock)))
(thread-start!
(make-thread
(lambda ()
(handler in out)
(close-input-port in)
(close-output-port out)
(close-file-descriptor sock))))))
;; Basic server loop - repeatedly call accept, and dispatch the new
;; socket to a handler.
(define (serve host port)
(let* ((addrinfo (get-address-info host port))
(sock (make-listener-socket addrinfo)))
(do () (#f)
(let ((fd (accept sock
(address-info-address addrinfo)
(address-info-address-length addrinfo))))
(run-io-handler fd echo-handler)))))
(serve "localhost" 5556)