orivej / pzmq

ZeroMQ 4.0+ Common Lisp bindings.

Home Page:http://orivej.github.io/pzmq/doc/index.html

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Add router/dealer server to examples

phoe opened this issue · comments

I have created a very rough example of an asynchronous N-to-1 server using dealer/router sockets. If my code isn't complete beginner trash, it might be good to add it to the examples section.

;; modified from pzmq examples

(defun hwclient (&optional (server-address "tcp://localhost:5555"))
  "Translation of http://zguide.zeromq.org/c:hwclient updated for ZMQ 3.
Includes some parameters in with-* macros to demonstrate syntax."
  (pzmq:with-context (ctx :max-sockets 10)
    (pzmq:with-socket (requester ctx) (:dealer :affinity 3 :linger 100)
      ;; linger is important in case of (keyboard) interrupt;
      ;; see http://api.zeromq.org/3-3:zmq-ctx-destroy
      (pzmq:connect requester server-address)
      (dotimes (i 10)
        (format t "Sending Hello ~d...~%" i)
        (pzmq:send requester "Hello!" :dontwait nil)
        (write-string "Receiving... ")
        (write-line (pzmq:recv-string requester))))))

(defun hwserver (&optional (listen-address "tcp://*:5555"))
  "Translation of http://zguide.zeromq.org/c:hwserver updated for ZMQ 3. "
  (pzmq:with-context nil ; use *default-context*
    (pzmq:with-socket responder :router
      (pzmq:bind responder listen-address)
      (dotimes (i 10)
        (pzmq:with-message msg
          (pzmq:msg-recv msg responder)
          (let ((identity (cffi:foreign-array-to-lisp
                           (pzmq:msg-data msg) `(:array :unsigned-char 5)
                           :element-type '(unsigned-byte 8))))
            (print identity)
            (pzmq:msg-recv msg responder)
            (let ((hello (cffi:foreign-string-to-lisp
                          (pzmq:msg-data msg)
                          :count (pzmq:msg-size msg))))
              (write-line hello))
            (cffi:with-pointer-to-vector-data (pointer identity)
              (pzmq:send responder pointer :len 5 :sndmore t))
            (pzmq:send responder "World!")
            (write-line "Sent response...")))))))

;; run (hwclient) and (hwserver) on two different Lisp threads/instances on the same machine