Shammer's Philosophy

My private adversaria

応答を返す UDP Server

自動起動スクリプトの作成 - ShammerismUDP Server は、メッセージを受信したらそれをそのままクライアントのIPとかと一緒にログに記録するだけの動作だが、これが応答を返すようにしてみた。

(defun start ()
  (let ((server (make-socket :type :datagram
			     :local-host "0.0.0.0"
			     :local-port 7001
			     :format :binary)))
    (with-open-file (f "/var/log/clozure-udp-server.log"
		       :direction :output
		       :if-exists :supersede
		       :if-does-not-exist :create)
		    (do () ()
			(multiple-value-bind (buffer length client-ip client-port)
					     (receive-from server 512)
					     (when (equalp buffer #(81 85 73 84 10))
					       (return))
					     (format f "[~A:~A] Received byte length is ~A, message is ~A~%"
						     (ipaddr-to-dotted client-ip)
						     client-port
						     length
						     (decode-string-from-octets buffer :external-format :UTF-8))
					     (force-output f)
					     ;;;
					     ;;; Receive
					     ;;;
					     (multiple-value-bind (char-vector rcv-len)
						 (encode-string-to-octets
						  (format nil "OK~%")
						  :external-format :utf-8)
					       (send-to server char-vector rcv-len :remote-host client-ip :remote-port client-port)))))
    (format t "FINISH!~%")))
(save-application "ccludp" :toplevel-function #'start :prepend-kernel t)