mirror of
https://github.com/ashinn/chibi-scheme.git
synced 2025-05-19 05:39:18 +02:00
Cleanup up echo server example.
This commit is contained in:
parent
470d562dd5
commit
4a59cc5a68
2 changed files with 19 additions and 33 deletions
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Add table
Reference in a new issue