« Gardeners | LW PE 4.4.6 » |
UDP und Lisp
Ich habe bisher nichts in Lisp mit dem UDP Protokoll gemacht und wollte mal testen, ob das kompliziert sei. Es ist mit einem Lisp-Compiler wie OpenMCL sehr einfach, stellt sich nach zwei Minuten heraus, vor allem dank der UDP-spezifischen Socket-Funktionen "send-to" und "receive-from".
Wir brauchen eigentlich nur zwei Loops zu bauen. Der "Server" muss den Hostname und den Port des Clients natürlich wissen, damit er antworten kann. Die Werte zieht man hier mit "multiple-value-bind" aus der "receive-from"-Funktion heraus und füttert damit wieder "send-to".
Das folgende Beispiel ist natürlich nichts als trivial:
(defpackage udp-test (:use common-lisp ccl))
(in-package :udp-test)
(defconstant +buffer-size+ 1024)
(defun udp-server-daemon (port) (process-run-function (format nil "udp receiving on port ~a" port) #'udp-server port))
(defun udp-server (port) (with-open-socket (sock :type :datagram :local-port port) (loop (multiple-value-bind (answer len client-ip client-port) (receive-from sock +buffer-size+ :extract t) (let ((reply (concatenate 'string "Echo from server: " answer))) (send-to sock reply (length reply) :remote-host (ipaddr-to-hostname client-ip) :remote-port client-port))))))
(defun udp-client (remote-host remote-port) (with-open-socket (sock :type :datagram) (loop (let ((query (read-line))) (when (string-equal query "quit") (return 'done)) (send-to sock query (length query) :remote-host remote-host :remote-port remote-port) (format t "~A~%" (receive-from sock +buffer-size+ :extract t))))))
Deprecated: Assigning the return value of new by reference is deprecated in /var/www/html/skins/_item_feedback.inc.php on line 156