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