diff --git a/examples/echo-server.scm b/examples/echo-server.scm index 22b569f1..fcdde84a 100644 --- a/examples/echo-server.scm +++ b/examples/echo-server.scm @@ -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) diff --git a/lib/chibi/net/server.scm b/lib/chibi/net/server.scm index ffdd6a8c..663fdc30 100644 --- a/lib/chibi/net/server.scm +++ b/lib/chibi/net/server.scm @@ -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)