Data commit
This commit is contained in:
parent
7387c8f97b
commit
cb5bb5e222
199093 changed files with 3378972 additions and 0 deletions
24
Task/Echo-server/Common-Lisp/echo-server-1.lisp
Normal file
24
Task/Echo-server/Common-Lisp/echo-server-1.lisp
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
(ql:quickload (list :usocket))
|
||||
(defpackage :echo (:use :cl :usocket))
|
||||
(in-package :echo)
|
||||
|
||||
(defun read-all (stream)
|
||||
(loop for char = (read-char-no-hang stream nil :eof)
|
||||
until (or (null char) (eql char :eof)) collect char into msg
|
||||
finally (return (values msg char))))
|
||||
|
||||
(defun echo-server (port &optional (log-stream *standard-output*))
|
||||
(let ((connections (list (socket-listen "127.0.0.1" port :reuse-address t))))
|
||||
(unwind-protect
|
||||
(loop (loop for ready in (wait-for-input connections :ready-only t)
|
||||
do (if (typep ready 'stream-server-usocket)
|
||||
(push (socket-accept ready) connections)
|
||||
(let* ((stream (socket-stream ready))
|
||||
(msg (concatenate 'string "You said: " (read-all stream))))
|
||||
(format log-stream "Got message...~%")
|
||||
(write-string msg stream)
|
||||
(socket-close ready)
|
||||
(setf connections (remove ready connections))))))
|
||||
(loop for c in connections do (loop while (socket-close c))))))
|
||||
|
||||
(echo-server 12321)
|
||||
8
Task/Echo-server/Common-Lisp/echo-server-2.lisp
Normal file
8
Task/Echo-server/Common-Lisp/echo-server-2.lisp
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
(defun echo-send (message port)
|
||||
(with-client-socket (sock str "127.0.0.1" port)
|
||||
(write-string message str)
|
||||
(force-output str)
|
||||
(when (wait-for-input sock :timeout 5)
|
||||
(coerce (read-all str) 'string))))
|
||||
|
||||
(echo-send "Hello echo!" 12321)
|
||||
47
Task/Echo-server/Common-Lisp/echo-server-3.lisp
Normal file
47
Task/Echo-server/Common-Lisp/echo-server-3.lisp
Normal file
|
|
@ -0,0 +1,47 @@
|
|||
(defvar *clients* '()
|
||||
"This is a list of (socket :input status) which is used with
|
||||
`socket:socket-status' to test for data ready on a socket.")
|
||||
|
||||
(defun echo-server (port)
|
||||
"Listen on `port' for new client connections and for data arriving on
|
||||
any existing client connections"
|
||||
(let ((server (socket:socket-server port)))
|
||||
(format t "Echo service listening on port ~a:~d~%"
|
||||
(socket:socket-server-host server)
|
||||
(socket:socket-server-port server))
|
||||
(unwind-protect
|
||||
(loop
|
||||
(when (socket:socket-status server 0 1)
|
||||
(echo-accept-client (socket:socket-accept server
|
||||
:external-format :dos
|
||||
:buffered t)))
|
||||
(when *clients*
|
||||
(socket:socket-status *clients* 0 1)
|
||||
(mapcar #'(lambda (client)
|
||||
(when (eq :input (cddr client))
|
||||
(echo-service-client (car client)))
|
||||
(when (eq :eof (cddr client))
|
||||
(echo-close-client (car client)))) *clients*)))
|
||||
(socket-server-close server))))
|
||||
|
||||
(defun echo-accept-client (socket)
|
||||
"Accept a new client connection and add it to the watch list."
|
||||
(multiple-value-bind
|
||||
(host port) (socket:socket-stream-peer socket)
|
||||
(format t "Connect from ~a:~d~%" host port))
|
||||
(push (list socket :input nil) *clients*))
|
||||
|
||||
(defun echo-service-client (socket)
|
||||
(let ((line (read-line socket nil nil)))
|
||||
(princ line socket)
|
||||
(finish-output socket)))
|
||||
|
||||
(defun echo-close-client (socket)
|
||||
"Close a client connection and remove it from the watch list."
|
||||
(multiple-value-bind
|
||||
(host port) (socket:socket-stream-peer socket)
|
||||
(format t "Closing connection from ~a:~d~%" host port))
|
||||
(close socket)
|
||||
(setq *clients* (remove socket *clients* :key #'car)))
|
||||
|
||||
(echo-server 12321)
|
||||
Loading…
Add table
Add a link
Reference in a new issue