高レベルソケットインターフェース
Cとかと比べるととっても簡単。echoサーバ/クライアントを書いてみた。
;;;echo-server.scm #!/usr/local/bin/gosh (use gauche.net) (define (echo-server port) (let* ((serv-soc (make-server-socket 'inet port)) (soc (socket-accept serv-soc)) (in (socket-input-port soc)) (out (socket-output-port soc))) (letrec ((iter ; メインループ (lambda (line) (if (eof-object? line) (begin ; 終了処理 (socket-close soc) (socket-close serv-soc) (exit)) (begin ; 処理と再帰呼び出し (format out "~A~%" line) ; (flush out) (iter (read-line in))))))) (iter (read-line in))))) (define (main args) (if (not (= (length args) 2)) (begin (format #t "Usage: echo-server port~%") (exit))) (echo-server (string->number (cadr args))))
;;;echo-client.scm #!/usr/local/bin/gosh (use gauche.net) (define (echo-client host port) (let ((soc (make-client-socket 'inet host port))) (call-with-client-socket soc (lambda (soc-in-port soc-out-port) ;メインループ (letrec ((iter (lambda (line) (if (string=? line "quit") (begin ; 終了処理 (socket-close soc) (exit)) (begin ; 処理と再帰呼び出し (format soc-out-port "~A~%" line) ; 入力をサーバに送信 ; (flush soc-out-port) (format #t "~A~%" (read-line soc-in-port)) ; サーバからの返答を標準出力に出す ; (flush (current-output-port)) (iter (read-line (current-input-port)))))))) (iter (read-line (current-input-port)))))))) (define (main args) (if (not (= (length args) 3)) (begin (format #t "Usage: echo-client hostname port-numbar~%") (exit))) (echo-client (cadr args) (string->number (caddr args))))