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. ;; Copy each input line to output.
(define (echo-handler in out) (define (echo-handler in out sock addr)
(let ((line (read-line in))) (let ((line (read-line in)))
(cond (cond
((not (eof-object? line)) ((not (or (eof-object? line) (equal? line "")))
(display "read: ") (write line) (newline)
(display line out) (display line out)
(newline out) (newline out)
(flush-output out) (flush-output-port out)
(echo-handler in out))))) (thread-yield!)
(echo-handler in out sock addr)))))
;; Run a handler in a separate thread on the input and output ports, ;; Start the server on localhost:5556 dispatching clients to echo-handler.
;; then cleanup. (run-net-server 5556 echo-handler)
(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)

View file

@ -4,9 +4,13 @@
(define default-max-requests 10000) (define default-max-requests 10000)
(define (run-net-server listener-or-addr handler . o) (define (run-net-server listener-or-addr handler . o)
(let* ((listener (if (integer? listener-or-addr) (let* ((listener (cond
listener-or-addr ((fileno? listener-or-addr)
(make-listener-socket 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)) (max-requests (if (pair? o) (car o) default-max-requests))
(debug? (and (pair? o) (pair? (cdr o))))) (debug? (and (pair? o) (pair? (cdr o)))))
(define (log-error msg . args) (define (log-error msg . args)