2010-02-10 16:18:46 +01:00
|
|
|
zmq(7)
|
|
|
|
======
|
2009-12-04 10:06:46 +01:00
|
|
|
|
2010-02-10 16:18:46 +01:00
|
|
|
|
|
|
|
NAME
|
|
|
|
----
|
|
|
|
zmq - 0MQ lightweight messaging kernel
|
|
|
|
|
|
|
|
|
|
|
|
SYNOPSIS
|
|
|
|
--------
|
2010-03-09 18:47:31 +01:00
|
|
|
*#include <zmq.h>*
|
2009-12-04 10:06:46 +01:00
|
|
|
|
2010-03-09 18:47:31 +01:00
|
|
|
*cc* ['flags'] 'files' *-lzmq* ['libraries']
|
2009-12-04 10:06:46 +01:00
|
|
|
|
|
|
|
|
2010-03-09 18:47:31 +01:00
|
|
|
DESCRIPTION
|
|
|
|
-----------
|
|
|
|
The 0MQ lightweight messaging kernel is a library which extends the standard
|
|
|
|
socket interfaces with features traditionally provided by specialised
|
|
|
|
_messaging middleware_ products. 0MQ sockets provide an abstraction of
|
2012-05-21 14:06:34 +02:00
|
|
|
asynchronous _message queues_, multiple _messaging patterns_, message
|
2010-03-09 18:47:31 +01:00
|
|
|
filtering (_subscriptions_), seamless access to multiple _transport protocols_
|
|
|
|
and more.
|
2009-12-04 10:06:46 +01:00
|
|
|
|
2010-03-09 18:47:31 +01:00
|
|
|
This documentation presents an overview of 0MQ concepts, describes how 0MQ
|
|
|
|
abstracts standard sockets and provides a reference manual for the functions
|
|
|
|
provided by the 0MQ library.
|
2009-12-04 10:06:46 +01:00
|
|
|
|
|
|
|
|
2010-03-09 18:47:31 +01:00
|
|
|
Context
|
|
|
|
~~~~~~~
|
2016-11-21 14:11:33 +01:00
|
|
|
The 0MQ 'context' keeps the list of sockets and manages the async I/O thread
|
|
|
|
and internal queries.
|
|
|
|
|
2012-03-19 19:41:20 -05:00
|
|
|
Before using any 0MQ library functions you must create a 0MQ 'context'. When
|
|
|
|
you exit your application you must destroy the 'context'. These functions let
|
|
|
|
you work with 'contexts':
|
|
|
|
|
|
|
|
Create a new 0MQ context::
|
|
|
|
linkzmq:zmq_ctx_new[3]
|
|
|
|
|
|
|
|
Work with context properties::
|
|
|
|
linkzmq:zmq_ctx_set[3]
|
|
|
|
linkzmq:zmq_ctx_get[3]
|
|
|
|
|
|
|
|
Destroy a 0MQ context::
|
2014-04-29 12:06:57 +02:00
|
|
|
linkzmq:zmq_ctx_shutdown[3]
|
2013-01-17 14:36:38 -08:00
|
|
|
linkzmq:zmq_ctx_term[3]
|
2012-03-19 19:41:20 -05:00
|
|
|
|
2010-03-09 18:47:31 +01:00
|
|
|
Thread safety
|
|
|
|
^^^^^^^^^^^^^
|
|
|
|
A 0MQ 'context' is thread safe and may be shared among as many application
|
2010-12-01 10:57:37 +01:00
|
|
|
threads as necessary, without any additional locking required on the part of
|
|
|
|
the caller.
|
|
|
|
|
|
|
|
Individual 0MQ 'sockets' are _not_ thread safe except in the case where full
|
|
|
|
memory barriers are issued when migrating a socket from one thread to another.
|
|
|
|
In practice this means applications can create a socket in one thread with
|
|
|
|
_zmq_socket()_ and then pass it to a _newly created_ thread as part of thread
|
2014-11-07 22:24:07 -08:00
|
|
|
initialisation, for example via a structure passed as an argument to
|
2010-12-01 10:57:37 +01:00
|
|
|
_pthread_create()_.
|
2010-03-09 18:47:31 +01:00
|
|
|
|
|
|
|
|
|
|
|
Multiple contexts
|
|
|
|
^^^^^^^^^^^^^^^^^
|
|
|
|
Multiple 'contexts' may coexist within a single application. Thus, an
|
|
|
|
application can use 0MQ directly and at the same time make use of any number of
|
|
|
|
additional libraries or components which themselves make use of 0MQ as long as
|
|
|
|
the above guidelines regarding thread safety are adhered to.
|
|
|
|
|
|
|
|
|
|
|
|
Messages
|
|
|
|
~~~~~~~~
|
|
|
|
A 0MQ message is a discrete unit of data passed between applications or
|
|
|
|
components of the same application. 0MQ messages have no internal structure and
|
2010-03-10 12:19:39 +01:00
|
|
|
from the point of view of 0MQ itself they are considered to be opaque binary
|
|
|
|
data.
|
2010-03-09 18:47:31 +01:00
|
|
|
|
|
|
|
The following functions are provided to work with messages:
|
2009-12-04 10:06:46 +01:00
|
|
|
|
2010-02-10 16:18:46 +01:00
|
|
|
Initialise a message::
|
|
|
|
linkzmq:zmq_msg_init[3]
|
2010-03-09 18:47:31 +01:00
|
|
|
linkzmq:zmq_msg_init_size[3]
|
2020-04-09 22:59:43 +00:00
|
|
|
linkzmq:zmq_msg_init_buffer[3]
|
2010-03-09 18:47:31 +01:00
|
|
|
linkzmq:zmq_msg_init_data[3]
|
2010-02-10 16:18:46 +01:00
|
|
|
|
2012-02-15 15:37:35 -06:00
|
|
|
Sending and receiving a message::
|
|
|
|
linkzmq:zmq_msg_send[3]
|
|
|
|
linkzmq:zmq_msg_recv[3]
|
|
|
|
|
2010-03-09 18:47:31 +01:00
|
|
|
Release a message::
|
2010-02-10 16:18:46 +01:00
|
|
|
linkzmq:zmq_msg_close[3]
|
2009-12-04 10:06:46 +01:00
|
|
|
|
2010-02-10 16:18:46 +01:00
|
|
|
Access message content::
|
|
|
|
linkzmq:zmq_msg_data[3]
|
|
|
|
linkzmq:zmq_msg_size[3]
|
2012-02-15 18:41:09 -06:00
|
|
|
linkzmq:zmq_msg_more[3]
|
2009-12-04 10:06:46 +01:00
|
|
|
|
2012-02-15 18:41:09 -06:00
|
|
|
Work with message properties::
|
2014-04-10 11:55:40 +02:00
|
|
|
linkzmq:zmq_msg_gets[3]
|
2012-02-15 19:28:29 -06:00
|
|
|
linkzmq:zmq_msg_get[3]
|
|
|
|
linkzmq:zmq_msg_set[3]
|
2012-02-15 10:05:22 -06:00
|
|
|
|
2010-02-10 16:18:46 +01:00
|
|
|
Message manipulation::
|
|
|
|
linkzmq:zmq_msg_copy[3]
|
|
|
|
linkzmq:zmq_msg_move[3]
|
2009-12-04 10:06:46 +01:00
|
|
|
|
|
|
|
|
2010-03-09 18:47:31 +01:00
|
|
|
Sockets
|
|
|
|
~~~~~~~
|
2017-06-23 18:57:33 +02:00
|
|
|
0MQ sockets present an abstraction of an asynchronous _message queue_, with the
|
2010-06-02 18:36:34 +02:00
|
|
|
exact queueing semantics depending on the socket type in use. See
|
|
|
|
linkzmq:zmq_socket[3] for the socket types provided.
|
2010-03-09 18:47:31 +01:00
|
|
|
|
|
|
|
The following functions are provided to work with sockets:
|
2009-12-04 10:06:46 +01:00
|
|
|
|
2010-02-10 16:18:46 +01:00
|
|
|
Creating a socket::
|
|
|
|
linkzmq:zmq_socket[3]
|
|
|
|
|
|
|
|
Closing a socket::
|
|
|
|
linkzmq:zmq_close[3]
|
2009-12-04 10:06:46 +01:00
|
|
|
|
2010-05-31 14:13:41 +02:00
|
|
|
Manipulating socket options::
|
|
|
|
linkzmq:zmq_getsockopt[3]
|
2010-02-10 16:18:46 +01:00
|
|
|
linkzmq:zmq_setsockopt[3]
|
2009-12-04 10:06:46 +01:00
|
|
|
|
2010-02-10 16:18:46 +01:00
|
|
|
Establishing a message flow::
|
|
|
|
linkzmq:zmq_bind[3]
|
|
|
|
linkzmq:zmq_connect[3]
|
2009-12-04 10:06:46 +01:00
|
|
|
|
2010-03-09 18:47:31 +01:00
|
|
|
Sending and receiving messages::
|
2012-09-06 18:20:33 +09:00
|
|
|
linkzmq:zmq_msg_send[3]
|
|
|
|
linkzmq:zmq_msg_recv[3]
|
2010-02-10 16:18:46 +01:00
|
|
|
linkzmq:zmq_send[3]
|
|
|
|
linkzmq:zmq_recv[3]
|
2013-09-20 14:28:06 +02:00
|
|
|
linkzmq:zmq_send_const[3]
|
2009-12-04 10:06:46 +01:00
|
|
|
|
2014-12-23 01:14:38 +01:00
|
|
|
Monitoring socket events::
|
2013-10-28 11:48:28 +01:00
|
|
|
linkzmq:zmq_socket_monitor[3]
|
|
|
|
|
2010-06-02 18:36:34 +02:00
|
|
|
.Input/output multiplexing
|
2010-03-09 18:47:31 +01:00
|
|
|
0MQ provides a mechanism for applications to multiplex input/output events over
|
|
|
|
a set containing both 0MQ sockets and standard sockets. This mechanism mirrors
|
|
|
|
the standard _poll()_ system call, and is described in detail in
|
2018-05-13 18:11:43 +02:00
|
|
|
linkzmq:zmq_poll[3]. This API is deprecated, however.
|
|
|
|
|
|
|
|
There is a new DRAFT API with multiple zmq_poller_* function, which is described
|
|
|
|
in linkzmq:zmq_poller[3].
|
2010-02-10 16:18:46 +01:00
|
|
|
|
|
|
|
|
2010-03-09 18:47:31 +01:00
|
|
|
Transports
|
|
|
|
~~~~~~~~~~
|
|
|
|
A 0MQ socket can use multiple different underlying transport mechanisms.
|
|
|
|
Each transport mechanism is suited to a particular purpose and has its own
|
|
|
|
advantages and drawbacks.
|
2009-12-04 10:06:46 +01:00
|
|
|
|
2010-03-09 18:47:31 +01:00
|
|
|
The following transport mechanisms are provided:
|
2009-12-04 10:06:46 +01:00
|
|
|
|
2010-03-09 18:47:31 +01:00
|
|
|
Unicast transport using TCP::
|
2010-02-10 16:18:46 +01:00
|
|
|
linkzmq:zmq_tcp[7]
|
2009-12-04 10:06:46 +01:00
|
|
|
|
2010-03-09 18:47:31 +01:00
|
|
|
Reliable multicast transport using PGM::
|
2010-02-10 16:18:46 +01:00
|
|
|
linkzmq:zmq_pgm[7]
|
2009-12-04 10:06:46 +01:00
|
|
|
|
2010-03-09 18:47:31 +01:00
|
|
|
Local inter-process communication transport::
|
2010-02-10 16:18:46 +01:00
|
|
|
linkzmq:zmq_ipc[7]
|
2010-01-15 14:11:39 +01:00
|
|
|
|
2010-03-09 18:47:31 +01:00
|
|
|
Local in-process (inter-thread) communication transport::
|
2010-02-10 16:18:46 +01:00
|
|
|
linkzmq:zmq_inproc[7]
|
2009-12-04 10:06:46 +01:00
|
|
|
|
2015-12-07 18:19:45 +06:00
|
|
|
Virtual Machine Communications Interface (VMC) transport::
|
|
|
|
linkzmq:zmq_vmci[7]
|
|
|
|
|
2016-04-29 11:32:12 +03:00
|
|
|
Unreliable unicast and multicast using UDP::
|
|
|
|
linkzmq:zmq_udp[7]
|
|
|
|
|
2010-02-10 16:18:46 +01:00
|
|
|
|
2012-09-06 19:20:21 +09:00
|
|
|
Proxies
|
2012-03-16 16:39:11 -05:00
|
|
|
~~~~~~~
|
2012-09-06 19:20:21 +09:00
|
|
|
0MQ provides 'proxies' to create fanout and fan-in topologies. A proxy connects
|
|
|
|
a 'frontend' socket to a 'backend' socket and switches all messages between the
|
|
|
|
two sockets, opaquely. A proxy may optionally capture all traffic to a third
|
|
|
|
socket. To start a proxy in an application thread, use linkzmq:zmq_proxy[3].
|
2012-03-16 16:39:11 -05:00
|
|
|
|
|
|
|
|
2013-05-15 17:54:03 +02:00
|
|
|
Security
|
|
|
|
~~~~~~~~
|
|
|
|
A 0MQ socket can select a security mechanism. Both peers must use the same
|
|
|
|
security mechanism.
|
|
|
|
|
|
|
|
The following security mechanisms are provided for IPC and TCP connections:
|
|
|
|
|
|
|
|
Null security::
|
|
|
|
linkzmq:zmq_null[7]
|
|
|
|
|
2013-06-20 18:09:12 +02:00
|
|
|
Plain-text authentication using username and password::
|
|
|
|
linkzmq:zmq_plain[7]
|
2013-05-15 17:54:03 +02:00
|
|
|
|
2013-06-20 18:09:12 +02:00
|
|
|
Elliptic curve authentication and encryption::
|
2013-05-15 17:54:03 +02:00
|
|
|
linkzmq:zmq_curve[7]
|
|
|
|
|
2014-12-23 01:14:38 +01:00
|
|
|
Generate a CURVE keypair in armored text format::
|
2013-09-30 15:14:02 +02:00
|
|
|
linkzmq:zmq_curve_keypair[3]
|
|
|
|
|
2016-12-26 14:23:32 +01:00
|
|
|
Derive a CURVE public key from a secret key:
|
|
|
|
linkzmq:zmq_curve_public[3]
|
|
|
|
|
2014-12-23 01:14:38 +01:00
|
|
|
Converting keys to/from armoured text strings::
|
2013-09-30 15:14:02 +02:00
|
|
|
linkzmq:zmq_z85_decode[3]
|
|
|
|
linkzmq:zmq_z85_encode[3]
|
|
|
|
|
2013-05-15 17:54:03 +02:00
|
|
|
|
2010-03-09 18:47:31 +01:00
|
|
|
ERROR HANDLING
|
|
|
|
--------------
|
|
|
|
The 0MQ library functions handle errors using the standard conventions found on
|
|
|
|
POSIX systems. Generally, this means that upon failure a 0MQ library function
|
|
|
|
shall return either a NULL value (if returning a pointer) or a negative value
|
|
|
|
(if returning an integer), and the actual error code shall be stored in the
|
|
|
|
'errno' variable.
|
|
|
|
|
2010-06-03 14:08:36 +02:00
|
|
|
On non-POSIX systems some users may experience issues with retrieving the
|
|
|
|
correct value of the 'errno' variable. The _zmq_errno()_ function is provided
|
|
|
|
to assist in these cases; for details refer to linkzmq:zmq_errno[3].
|
|
|
|
|
|
|
|
The _zmq_strerror()_ function is provided to translate 0MQ-specific error codes
|
|
|
|
into error message strings; for details refer to linkzmq:zmq_strerror[3].
|
2010-03-09 18:47:31 +01:00
|
|
|
|
|
|
|
|
2014-12-23 01:14:38 +01:00
|
|
|
UTILITY
|
|
|
|
-------
|
|
|
|
The following utility functions are provided:
|
|
|
|
|
|
|
|
Working with atomic counters::
|
|
|
|
linkzmq:zmq_atomic_counter_new[3]
|
|
|
|
linkzmq:zmq_atomic_counter_set[3]
|
|
|
|
linkzmq:zmq_atomic_counter_inc[3]
|
|
|
|
linkzmq:zmq_atomic_counter_dec[3]
|
|
|
|
linkzmq:zmq_atomic_counter_value[3]
|
|
|
|
linkzmq:zmq_atomic_counter_destroy[3]
|
|
|
|
|
|
|
|
|
2010-03-09 19:29:41 +01:00
|
|
|
MISCELLANEOUS
|
|
|
|
-------------
|
|
|
|
The following miscellaneous functions are provided:
|
|
|
|
|
|
|
|
Report 0MQ library version::
|
|
|
|
linkzmq:zmq_version[3]
|
|
|
|
|
|
|
|
|
2010-03-09 18:47:31 +01:00
|
|
|
LANGUAGE BINDINGS
|
|
|
|
-----------------
|
|
|
|
The 0MQ library provides interfaces suitable for calling from programs in any
|
|
|
|
language; this documentation documents those interfaces as they would be used
|
|
|
|
by C programmers. The intent is that programmers using 0MQ from other languages
|
|
|
|
shall refer to this documentation alongside any documentation provided by the
|
|
|
|
vendor of their language binding.
|
2010-02-10 16:18:46 +01:00
|
|
|
|
2012-05-21 14:06:34 +02:00
|
|
|
Language bindings ($$C++$$, Python, PHP, Ruby, Java and more) are provided by
|
|
|
|
members of the 0MQ community and pointers can be found on the 0MQ website.
|
2009-12-04 10:06:46 +01:00
|
|
|
|
2010-09-04 15:55:11 +02:00
|
|
|
|
|
|
|
AUTHORS
|
|
|
|
-------
|
2013-04-11 18:53:02 +02:00
|
|
|
This page was written by the 0MQ community. To make a change please
|
|
|
|
read the 0MQ Contribution Policy at <http://www.zeromq.org/docs:contributing>.
|
2010-09-04 15:55:11 +02:00
|
|
|
|
|
|
|
|
|
|
|
RESOURCES
|
|
|
|
---------
|
|
|
|
Main web site: <http://www.zeromq.org/>
|
|
|
|
|
|
|
|
Report bugs to the 0MQ development mailing list: <zeromq-dev@lists.zeromq.org>
|
|
|
|
|
|
|
|
|
|
|
|
COPYING
|
|
|
|
-------
|
|
|
|
Free use of this software is granted under the terms of the GNU Lesser General
|
|
|
|
Public License (LGPL). For details see the files `COPYING` and `COPYING.LESSER`
|
|
|
|
included with the 0MQ distribution.
|