Shammer's Philosophy

My private adversaria

sbcl で socket からアドレスとポートの情報を取得する

clisp

  • SOCKET:SOCKET-STREAM-LOCAL
  • SOCKET:SOCKET-STREAM-PEER

に相当する関数を使ってみた。sbcl だと、

  • sb-bsd-sockets:socket-name
  • sb-bsd-sockets:socket-peername

が相当するようだ。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))

関数にする場合は以下のような感じ。とりあえず、clispsbcl に対応させてみた。

(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)))