Shammer's Philosophy

My private adversaria

Lisp Condition Level 1

コンディション超入門 - Shammerismの続き。with-open-socket で試した。サンプルコードは以下のような感じで、意図的に同一ポートの Socket を Open してみる。

(defun open-http-server (listen-addr listen-port)
  (let ((host listen-addr)
	(port listen-port))
    (when (null host)
      (setf host "0.0.0.0"))
    (when (null port)
      (setf port "10080"))
    (handler-case (with-open-socket (server :type :stream :connect :passive :local-host host :local-port (parse-integer port))
				    (format t "> Started My Server...~%")
				    (loop
				     (let ((client (accept-connection server)))
				       (process-run-function "Handle Client Socket" 'handle-client client))))
		  (error (c)
			 (progn
			   (format t "~A~%" (type-of c))
			   (format t "~A~%" c))))))

handler-case の次の括弧で本体の処理を行い、その括弧の次に error のブロックを作成。この関数を二度実行すると、以下のような結果になる。

SOCKET-CREATION-ERROR
Address already in use (error #48) during socket creation operation in bind