Clisp Codes
;;; read-eval-print-server.lisp
;;;
;;; read-eval-print loop server
;;;
;;; the oringial code was on below page of clisp:
;;; http://clisp.org/impnotes.html#socket-ex-server
;;;
;;; limit the socket server to local connections("127.0.0.1") for security,
;;; but it also work for internet ip if you do not limit the server.
(let ((server (socket:socket-server 23 :INTERFACE "127.0.0.1")))
(format t "~&waiting for a connection on ~S:~D~%"
(socket:socket-server-host server)
(socket:socket-server-port server))
(unwind-protect
(loop
(with-open-stream (socket (socket:socket-accept server))
(multiple-value-bind (local-host local-port)
(socket:socket-stream-local socket)
(multiple-value-bind (remote-host remote-port)
(socket:socket-stream-peer socket)
(format t "~&connection: ~S:~D -- ~S:~D ~%"
remote-host remote-port local-host local-port)))
(loop
(when (eq :eof (socket:socket-status (cons socket :input))) (return))
(print (eval (read socket)) socket)
(loop
:for c = (read-char-no-hang socket nil nil)
:while c)
(format socket "ok~%")
(terpri socket))))
(socket:socket-server-close server)))
;;; read-eval-print-client.lisp
;;;
;;; read-eval-print client
(defun run-lisp-via-net (host lisp-codes &optional (port 23))
(with-open-stream
(socket (socket:socket-connect port host :external-format :dos))
(format socket "~A" lisp-codes)
(socket:socket-stream-shutdown socket :output)
(loop :for line = (read-line socket nil nil)
:while line
:collect line
:do (format t "~A ~%" line))))
;; Test Cases
(run-lisp-via-net "127.0.0.1"
"(ext:dir)")
(run-lisp-via-net "127.0.0.1"
"(load \"http-client.lisp\")"
23)
Testing and results
start the server:
test the client:
Log outputted on server:
Q: what does this demo mean?
A: you can run any code via net as you want, no matter these codes is from client or on server. Clisp can make all data as code ...
Enjoy~ Mars