Cleanup up echo server example.

This commit is contained in:
Alex Shinn 2012-09-16 15:20:09 +09:00
parent 470d562dd5
commit 4a59cc5a68
2 changed files with 19 additions and 33 deletions

View file

@ -1,38 +1,20 @@
(import (scheme) (srfi 18) (chibi net) (chibi io) (chibi filesystem))
;; Simple R7RS echo server, using (srfi 18) threads and the
;; run-net-server utility from (chibi net server).
(import (scheme base) (scheme write) (srfi 18) (chibi net server))
;; Copy each input line to output.
(define (echo-handler in out)
(define (echo-handler in out sock addr)
(let ((line (read-line in)))
(cond
((not (eof-object? line))
((not (or (eof-object? line) (equal? line "")))
(display "read: ") (write line) (newline)
(display line out)
(newline out)
(flush-output out)
(echo-handler in out)))))
(flush-output-port out)
(thread-yield!)
(echo-handler in out sock addr)))))
;; 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)
;; Start the server on localhost:5556 dispatching clients to echo-handler.
(run-net-server 5556 echo-handler)

View file

@ -4,9 +4,13 @@
(define default-max-requests 10000)
(define (run-net-server listener-or-addr handler . o)
(let* ((listener (if (integer? listener-or-addr)
listener-or-addr
(make-listener-socket listener-or-addr)))
(let* ((listener (cond
((fileno? listener-or-addr)
listener-or-addr)
((integer? listener-or-addr)
(make-listener-socket (get-address-info "localhost" 5556)))
(else
(make-listener-socket listener-or-addr))))
(max-requests (if (pair? o) (car o) default-max-requests))
(debug? (and (pair? o) (pair? (cdr o)))))
(define (log-error msg . args)