chickadee » nanomsg


Chicken Scheme bindings for the lightweight ZMQ-alternative, nanomsg. There exists Chicken ZMQ bindings, but this turned out to be a little troublesome with zmq_poll blocking other srfi-18 threads.

Why nanomsg

Nanomsg is smaller, written in C, has a simplified API (sockets are simple ints), no multipart messages, and has explicit support for poll on a socket's recv file-descriptor.


This egg requires nanomsg-[0.4|0.5|0.6]-beta.


nn-socket protocol #!optional domainprocedure

Create a nanomsg socket. Protocol can be any of the symbols pair, pub, sub, pull, push, req, rep, surveyor, respondent or bus. Domain can be the symbol sp or raw, and defaults to sp.

nn-bind socket addressprocedure

Binds nanomsg socket to address, where address is a string of the form "ipc:///var/ipc/music.nn.pair" or "tcp://". If the nn-library can't parse the address string, it throws an "Illegal argument" error.

nn-connect socket addressprocedure

Connects nanomsg socket socket to address.

nn-subscribe socket prefixprocedure

Set the NN_SUBSCRIBE option on socket which will make the socket receive to all messages that start with prefix. Note that if this is never called, (nn-sock 'sub) sockets will never receive anything.

nn-recv socketprocedure

Receive a message from socket. This blocks until a message is received from nanomsg, but it does not block other srfi-18 threads. It always returns a string. An error is thrown if the socket is in an illegal state.

nn-send socket msgprocedure

Send a message on socket, using the socket's semantics. msg must be a string.

In the current implementation, this operation may block for certain protocols in which case other srfi-18 threads block too.

nn-recv* socket flagsprocedure

Receive a message from socket. This will block other srfi-18 threads, unless the nn/dontwait flag is specified, in which case nn-recv* will immediately with either a message as a string or #f (for EAGAIN). An error is thrown if socket is in an illegal state.

Note that memory is copied from the nanomsg buffer into a new scheme string.

nn-recv! socket buffer size flagsprocedure

A version of nn-recv* which requires a preallocated buffer. If the size of the buffer can be found automatically (using number-of-bytes), size can be #f.

nn-close socketprocedure

Explicitly close socket. This is normally not needed as this is done in the socket's finalizer.

Development Status

These bindings are incomplete, but all protocols and transport types should be supported. However, socket options (nn_setsockopt and nn_getsockopt) aren't supported with the exception of nn-subscribe. Patches are welcome!

Favored TODO's: - support socket options - bundle nanomsg itself?


;; test.scm
(use nanomsg)

(define s (nn-socket 'rep))
(nn-bind s "tcp://")

(let loop ((n 0))
  (nn-send s (conc (nn-recv s) " " n))
  (loop (add1 n)))

(nn-close s)

then test with the brilliant nanocat util that comes with [nanomsg]:

$ csi -s test.scm &
$ nanocat --req -l22022 -D"bottles of beer:" -A --interval 1

Contents »