1:
2:
3:
4: (use gauche.net)
5: (use gauche.selector)
6:
7: (define (echo-server port)
8: (let ((selector (make <selector>))
9: (servers (make-server-sockets #f port :reuse-addr? #t)))
10:
11: (define (echo client input output)
12: (let ((str (read-block 4096 input)))
13: (if (eof-object? str)
14: (begin (selector-delete! selector input #f #f)
15: (socket-close client))
16: (begin (display str output)
17: (flush output)))))
18:
19: (for-each
20: (lambda (server)
21:
22: (define (accept-handler sock flag)
23: (let* ((client (socket-accept server))
24: (output (socket-output-port client)))
25: (selector-add! selector
26: (socket-input-port client :buffered? #f)
27: (lambda (input flag)
28: (echo client input output))
29: '(r))))
30:
31: (selector-add! selector
32: (socket-fd server)
33: accept-handler
34: '(r)))
35: servers)
36: (do () (#f) (selector-select selector))))
37:
38: (define (main args)
39: (print "echo server starting on port 3131")
40: (echo-server 3131)
41: 0)