Hi,
I've just started using usocket, and it is very nice. The first thing I
did was to write a couple of helper macros for server-side socket
handling, and I thought they might be worth including in the library:
(defmacro with-listener (socket-specs &rest body)
"Listen for connections and clean up when done."
(destructuring-bind (socket-var &rest socket-options) socket-specs
(let ((var-name (gensym)))
`(let* ((,var-name (socket-listen ,@socket-options))
(,socket-var ,var-name))
(unwind-protect (progn ,@body)
(socket-close ,var-name))))))
(defmacro with-client-stream (socket-specs &rest body)
"Work with a client socket stream and clean up when done."
(destructuring-bind (stream-var listener-var &rest socket-options)
socket-specs
(let ((var-name (gensym)))
`(let* ((,var-name (socket-accept ,listener-var ,@socket-options))
(,stream-var (socket-stream ,var-name)))
(unwind-protect (progn ,@body)
(socket-close ,var-name))))))
They let you easily get started listening for connections and working
with connected clients (partly because all you see are the listener
socket and a stream for each client). e.g.
(defun handle-one-request ()
(with-listener (listener "127.0.0.1" 40389)
(with-client-stream (stream listener)
(handle-request stream))))
-Harold