mirror of
https://github.com/ashinn/chibi-scheme.git
synced 2025-05-19 05:39:18 +02:00
38 lines
1.1 KiB
Scheme
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)
|