高レベルソケットインターフェース

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))))