Shammer's Philosophy

My private adversaria

with-open-passive-socket ver 20120407

with-open-passive-socket ver 20120327 を別 package 化したら動かない - Shammerismで発見された問題を解消するために with-open-passive-socket の内容を変更。コード自体はかなりシンプルになった。

(defmacro with-open-passive-socket ((server addr port) &body body)
  `(let ((,server (open-socket-server ,addr ,port)))
     (unwind-protect
	  (when ,server
	    (do ()
		(nil)
	      ,@body))
       (when ,server
	 (close-server-socket ,server)))))

とりあえず、別パッケージから実行しても大丈夫になったように見えるが。。。呼出し例は以下。handle-client というクライアントソケットからデータの読み込みをしたりする関数や、server-socket から accept する accept-connection は別途定義されているものとする。

(handler-case
  (with-open-passive-socket (server addr port)
    (let ((client (accept-connection server)))
      (process-run-function "Handle Client Socket" 'handle-client client)))
(error (e)
  (format t "~A~%" (concatenate 'string (type-of e) "was thrown.")))