Shammer's Philosophy

My private adversaria

Lisp UDP Client

LispUDP のクライアントを書いてみた。

(let ((client (make-socket :type :datagram)))
  (multiple-value-bind (char-vector count)
      (encode-string-to-octets "Test" :external-format :UTF-8)
    (format t "char-vector is ~A~%" char-vector)
    (format t "char-vector type is ~A~%" (type-of char-vector))
    (format t "count is ~A~%" count)
    (send-to client char-vector count :remote-host "127.0.0.1" :remote-port 12345)))

(quit)

TCP とはだいぶ勝手が違う。コード量はこちらの方が少ないが。make-socket は type を datagram にする。TCP では type は stream だ。あと、接続先は make-socket ではなく、送信のタイミングで指定する。これは言語に関係なく同じだな。send-to を使用するが、send-to は binary でなければならないようで、テキスト情報は事前にバイナリの配列にしておく必要がある。送信サイズも必要だから、encode-string-to-octets を使用した。これは Clozure CL の例。他の処理系であれば、その処理系に用意されている関数を使用しなければならない。