Shammer's Philosophy

My private adversaria

with-open-passive-socket ver 20120322 を試す

with-open-passive-socket ver 20120322 - Shammerismで作成した Echo Server で使ってみることに。

(defun open-echo-server (addr port)
  (format t "> OpenEchoServer port open...~%")
  (with-open-passive-socket (server addr port)
    (do ()
	(nil)
      (let ((client (accept-client-socket server)))
	(unwind-protect
	     (let ((receive-buffer (make-array 0 :fill-pointer 0 :adjustable t :element-type '(unsigned-byte 8))))
	       (do ()
		   (nil)
		 (let ((b (read-byte client nil 'eof)))
		   (cond ((eql 'eof b)
			  (return))
			 (t
			  (vector-push-extend b receive-buffer)))
		   (format t "~A " b)
		   (when (equal b 10)
		     (return))))
	       (let ((received-message (decode-string-from-octets receive-buffer :external-format :utf-8)))
		 (format t "~A~%" received-message)
		 (when (string-equal received-message "quit")
		   (format t "received quit...~%")
		   (quit))))
	  (progn
	    (format t "Close client...~%")
	    (close-client-socket client)))))))

(open-echo-server "0.0.0.0" 7001)

期待通りに動作しているように見える。今度検討するとしたら、handler-case も組み込むことだろうか。Lisp 使いとして自信を持てるようになるまで、まだまだ覚えないといけないことが山程ある。。。