sbcl で socket からアドレスとポートの情報を取得する
clisp の
- SOCKET:SOCKET-STREAM-LOCAL
- SOCKET:SOCKET-STREAM-PEER
に相当する関数を使ってみた。sbcl だと、
が相当するようだ。multiple-value-bind で返り値を受け取ってやらないといけない点は同じ。こんな感じで使用できる。
(let* ((client-sock (make-instance 'inet-socket :type :stream :protocol :tcp)) (stream (socket-make-stream client-sock :output t :input t))) (socket-connect client-sock (resolve-hostname destination-host) destination-port) (multiple-value-bind (addr port) (socket-peername client-sock) (format t "peer name is ~A:~A~%" addr port)) (multiple-value-bind (addr port) (socket-name client-sock) (format t "local info : ~A:~A~%" addr port)) (format stream "~A~%" message) (force-output stream) (socket-close client-sock))
関数にする場合は以下のような感じ。とりあえず、clisp と sbcl に対応させてみた。
(defun log-peer-ip-port-info (socket) (multiple-value-bind (client-addr client-port) #+SBCL (sb-bsd-sockets:socket-peername socket) #+CLISP (socket:socket-stream-peer socket) (format t "Connected from ~A:~A~%" client-addr client-port)))