Provided by: libnanomsg-raw-perl_0.10-3_amd64 bug

NAME

       NanoMsg::Raw - Low-level interface to the nanomsg scalability protocols library

SYNOPSIS

           use Test::More;
           use NanoMsg::Raw;

           my $sb = nn_socket(AF_SP, NN_PAIR);
           nn_bind($sb, 'inproc://foo');

           my $sc = nn_socket(AF_SP, NN_PAIR);
           nn_connect($sc, 'inproc://foo');

           nn_send($sb, 'bar');
           nn_recv($sc, my $buf);
           is $buf, 'bar';

WARNING

       nanomsg, the c library this module is based on, is still in beta stage!

DESCRIPTION

       "NanoMsg::Raw" is a binding to the "nanomsg" C library. The goal of this module is to
       provide a very low-level and manual interface to all the functionality of the nanomsg
       library. It doesn't intend to provide a convenient high-level API, integration with event
       loops, or the like. Those are intended to be implemented as separate abstractions on top
       of "NanoMsg::Raw".

       The nanomsg C library is a high-performance implementation of several "scalability
       protocols". Scalability protocol's job is to define how multiple applications communicate
       to form a single distributed application. Implementation of following scalability
       protocols is available at the moment:

       •   "PAIR" simple one-to-one communication

       •   "BUS" simple many-to-many communication

       •   "REQREP" allows one to build clusters of stateless services to process user requests

       •   "PUBSUB" distributes messages to large sets of interested subscribers

       •   "PIPELINE" aggregates messages from multiple sources and load balances them among many
           destinations

       •   "SURVEY" allows one to query state of multiple applications in a single go

       Scalability protocols are layered on top of transport layer in the network stack. At the
       moment, nanomsg library supports following transports:

       •   "INPROC" transport within a process (between threads, modules etc.)

       •   "IPC" transport between processes on a single machine

       •   "TCP" network transport via TCP

       nn_socket($domain, $protocol)
               my $s = nn_socket(AF_SP, NN_PAIR);
               die nn_errno unless defined $s;

           Creates a nanomsg socket with specified $domain and $protocol. Returns a file
           descriptor for the newly created socket.

           Following domains are defined at the moment:

           •   "AF_SP" Standard full-blown SP socket.

           •   "AF_SP_RAW" Raw SP socket. Raw sockets omit the end-to-end functionality found in
               "AF_SP" sockets and thus can be used to implement intermediary devices in SP
               topologies.

           The $protocol parameter defines the type of the socket, which in turn determines the
           exact semantics of the socket. See "Protocols" to get the list of available protocols
           and their socket types.

           The newly created socket is initially not associated with any endpoints. In order to
           establish a message flow at least one endpoint has to be added to the socket using
           "nn_bind" or "nn_connect".

           Also note that type argument as found in standard "socket" function is omitted from
           "nn_socket". All the SP sockets are message-based and thus of "SOCK_SEQPACKET" type.

           If the function succeeds file descriptor of the new socket is returned. Otherwise,
           "undef" is returned and "nn_errno" is set to to one of the values defined below.

           •   "EAFNOSUPPORT" Specified address family is not supported.

           •   "EINVAL" Unknown protocol.

           •   "EMFILE" The limit on the total number of open SP sockets or OS limit for file
               descriptors has been reached.

           •   "ETERM" The library is terminating.

               Note that file descriptors returned by "nn_socket" function are not standard file
               descriptors and will exhibit undefined behaviour when used with system functions.
               Moreover, it may happen that a system file descriptor and file descriptor of an SP
               socket will incidentally collide (be equal).

       nn_close($s)
               nn_close($s) or die nn_errno;

           Closes the socket $s. Any buffered inbound messages that were not yet received by the
           application will be discarded. The library will try to deliver any outstanding
           outbound messages for the time specified by "NN_LINGER" socket option. The call will
           block in the meantime.

           If the function succeeds, a true value is returned. Otherwise, "undef" is returned and
           "nn_errno" is set to to one of the values defined below.

           •   "EBADF" The provided socket is invalid.

           •   "EINTR" Operation was interrupted by a signal. The socket is not fully closed yet.
               Operation can be re-started by calling "nn_close" again.

       nn_setsockopt($s, $level, $option, $value)
               nn_setsockopt($s, NN_SOL_SOCKET, NN_LINGER, 1000) or die nn_errno;
               nn_setsockopt($s, NN_SOL_SOCKET, NN_SUB_SUBSCRIBE, 'ABC') or die nn_errno;

           Sets the $value of the socket option $option. The $level argument specifies the
           protocol level at which the option resides. For generic socket-level options use the
           "NN_SOL_SOCKET" level. For socket-type-specific options use the socket type for the
           $level argument (e.g. "NN_SUB"). For transport-specific options use the ID of the
           transport as the $level argument (e.g. "NN_TCP").

           If the function succeeds a true value is returned. Otherwise, "undef" is returned and
           "nn_errno" is set to to one of the values defined below.

           •   "EBADF" The provided socket is invalid.

           •   "ENOPROTOOPT" The option is unknown at the level indicated.

           •   "EINVAL" The specified option value is invalid.

           •   "ETERM" The library is terminating.

           These are the generic socket-level ("NN_SOL_SOCKET" level) options:

           •   "NN_LINGER" Specifies how long the socket should try to send pending outbound
               messages after "nn_close" has been called, in milliseconds. Negative values mean
               infinite linger. The type of the option is int. The default value is 1000 (1
               second).

           •   "NN_SNDBUF" Size of the send buffer, in bytes. To prevent blocking for messages
               larger than the buffer, exactly one message may be buffered in addition to the
               data in the send buffer. The type of this option is int. The default value is
               128kB.

           •   "NN_RCVBUF" Size of the receive buffer, in bytes. To prevent blocking for messages
               larger than the buffer, exactly one message may be buffered in addition to the
               data in the receive buffer. The type of this option is int. The default value is
               128kB.

           •   "NN_SNDTIMEO" The timeout for send operation on the socket, in milliseconds. If a
               message cannot be sent within the specified timeout, an "EAGAIN" error is
               returned. Negative values mean infinite timeout. The type of the option is int.
               The default value is -1.

           •   "NN_RCVTIMEO" The timeout for recv operation on the socket, in milliseconds. If a
               message cannot be received within the specified timeout, an "EAGAIN" error is
               returned. Negative values mean infinite timeout. The type of the option is int.
               The default value is -1.

           •   "NN_RECONNECT_IVL" For connection-based transports such as TCP, this option
               specifies how long to wait, in milliseconds, when connection is broken before
               trying to re-establish it. Note that actual reconnect interval may be randomised
               to some extent to prevent severe reconnection storms. The type of the option is
               int. The default value is 100 (0.1 second).

           •   "NN_RECONNECT_IVL_MAX" This option is to be used only in addition to
               "NN_RECONNECT_IVL" option. It specifies maximum reconnection interval. On each
               reconnect attempt, the previous interval is doubled until "NN_RECONNECT_IVL_MAX"
               is reached. A value of zero means that no exponential backoff is performed and
               reconnect interval is based only on "NN_RECONNECT_IVL". If "NN_RECONNECT_IVL_MAX"
               is less than "NN_RECONNECT_IVL", it is ignored. The type of the option is int. The
               default value is 0.

           •   "NN_SNDPRIO" Sets outbound priority for endpoints subsequently added to the
               socket. This option has no effect on socket types that send messages to all the
               peers. However, if the socket type sends each message to a single peer (or a
               limited set of peers), peers with high priority take precedence over peers with
               low priority. The type of the option is int. The highest priority is 1, the lowest
               priority is 16. The default value is 8.

           •   "NN_IPV4ONLY" If set to 1, only IPv4 addresses are used. If set to 0, both IPv4
               and IPv6 addresses are used. The default value is 1.

       nn_getsockopt($s, $level, $option)
               my $linger = unpack 'i', nn_getsockopt($s, NN_SOL_SOCKET, NN_LINGER) || die nn_errno;

           Retrieves the value for the socket option $option. The $level argument specifies the
           protocol level at which the option resides. For generic socket-level options use the
           "NN_SOL_SOCKET" level. For socket-type-specific options use the socket type for the
           $level argument (e.g. "NN_SUB"). For transport-specific options use ID of the
           transport as the $level argument (e.g. "NN_TCP").

           The function returns a packed string representing the requested socket option, or
           "undef" on error, with one of the following reasons for the error placed in
           "nn_errno".

           •   "EBADF" The provided socket is invalid.

           •   "ENOPROTOOPT" The option is unknown at the $level indicated.

           •   "ETERM" The library is terminating.

           Just what is in the packed string depends on $level and $option; see the list of
           socket options for details; A common case is that the option is an integer, in which
           case the result is a packed integer, which you can decode using "unpack" with the "i"
           (or "I") format.

           This function can be used to retrieve the values for all the generic socket-level
           ("NN_SOL_SOCKET") options documented in "nn_getsockopt" and also supports these
           additional generic socket-level options that can only be retrieved but not set:

           •   "NN_DOMAIN" Returns the domain constant as it was passed to "nn_socket".

           •   "NN_PROTOCOL" Returns the protocol constant as it was passed to "nn_socket".

           •   "NN_SNDFD" Retrieves a file descriptor that is readable when a message can be sent
               to the socket. The descriptor should be used only for polling and never read from
               or written to. The type of the option is int. The descriptor becomes invalid and
               should not be used any more once the socket is closed. This socket option is not
               available for unidirectional recv-only socket types.

           •   "NN_RCVFD" Retrieves a file descriptor that is readable when a message can be
               received from the socket. The descriptor should be used only for polling and never
               read from or written to. The type of the option is int. The descriptor becomes
               invalid and should not be used any more once the socket is closed. This socket
               option is not available for unidirectional send-only socket types.

       nn_bind($s, $addr)
               my $eid = nn_bind($s, 'inproc://test');
               die nn_errno unless defined $eid;

           Adds a local endpoint to the socket $s. The endpoint can be then used by other
           applications to connect to.

           The $addr argument consists of two parts as follows: "transport://address". The
           "transport" specifies the underlying transport protocol to use. The meaning of the
           "address" part is specific to the underlying transport protocol.

           See "Transports" for a list of available transport protocols.

           The maximum length of the $addr parameter is specified by "NN_SOCKADDR_MAX" constant.

           Note that "nn_bind" and "nn_connect" may be called multiple times on the same socket
           thus allowing the socket to communicate with multiple heterogeneous endpoints.

           If the function succeeds, an endpoint ID is returned. Endpoint ID can be later used to
           remove the endpoint from the socket via "nn_shutdown" function.

           If the function fails, "undef" is returned and "nn_errno" is set to to one of the
           values defined below.

           •   "EBADF" The provided socket is invalid.

           •   "EMFILE" Maximum number of active endpoints was reached.

           •   "EINVAL" The syntax of the supplied address is invalid.

           •   "ENAMETOOLONG" The supplied address is too long.

           •   "EPROTONOSUPPORT" The requested transport protocol is not supported.

           •   "EADDRNOTAVAIL" The requested endpoint is not local.

           •   "ENODEV" Address specifies a nonexistent interface.

           •   "EADDRINUSE" The requested local endpoint is already in use.

           •   "ETERM" The library is terminating.

       nn_connect($s, $addr)
               my $eid = nn_connect($s, 'inproc://test');
               die nn_errno unless defined $eid;

           Adds a remote endpoint to the socket $s. The library would then try to connect to the
           specified remote endpoint.

           The $addr argument consists of two parts as follows: "transport://address". The
           "transport" specifies the underlying transport protocol to use. The meaning of the
           "address" part is specific to the underlying transport protocol.

           See "Protocols" for a list of available transport protocols.

           The maximum length of the $addr parameter is specified by "NN_SOCKADDR_MAX" constant.

           Note that "nn_connect" and "nn_bind" may be called multiple times on the same socket
           thus allowing the socket to communicate with multiple heterogeneous endpoints.

           If the function succeeds, an endpoint ID is returned. Endpoint ID can be later used to
           remove the endpoint from the socket via "nn_shutdown" function.

           If the function fails, "undef" is returned and "nn_errno" is set to to one of the
           values defined below.

           •   "EBADF" The provided socket is invalid.

           •   "EMFILE" Maximum number of active endpoints was reached.

           •   "EINVAL" The syntax of the supplied address is invalid.

           •   "ENAMETOOLONG" The supplied address is too long.

           •   "EPROTONOSUPPORT" The requested transport protocol is not supported.

           •   "ENODEV" Address specifies a nonexistent interface.

           •   "ETERM" The library is terminating.

       nn_shutdown($s, $eid)
               nn_shutdown($s, $eid) or die nn_errno;

           Removes an endpoint from socket $s. The "eid" parameter specifies the ID of the
           endpoint to remove as returned by prior call to "nn_bind" or "nn_connect".

           The "nn_shutdown" call will return immediately. However, the library will try to
           deliver any outstanding outbound messages to the endpoint for the time specified by
           the "NN_LINGER" socket option.

           If the function succeeds, a true value is returned. Otherwise, "undef" is returned and
           "nn_errno" is set to to one of the values defined below.

           •   "EBADF" The provided socket is invalid.

           •   "EINVAL" The how parameter doesn't correspond to an active endpoint.

           •   "EINTR" Operation was interrupted by a signal. The endpoint is not fully closed
               yet. Operation can be re-started by calling "nn_shutdown" again.

           •   "ETERM" The library is terminating.

       nn_send($s, $data, $flags=0)
               my $bytes_sent = nn_send($s, 'foo');
               die nn_errno unless defined $bytes_sent;

           This function will send a message containing the provided $data to the socket $s.

           $data can either be anything that can be used as a byte string in perl or a message
           buffer instance allocated by "nn_allocmsg". In case of a message buffer instance the
           instance will be deallocated and invalidated by the "nn_send" function. The buffer
           will be an instance of "NanoMsg::Raw::Message::Freed" after the call to "nn_send".

           Which of the peers the message will be sent to is determined by the particular socket
           type.

           The $flags argument, which defaults to 0, is a combination of the flags defined below:

           •   "NN_DONTWAIT" Specifies that the operation should be performed in non-blocking
               mode. If the message cannot be sent straight away, the function will fail with
               "nn_errno" set to "EAGAIN".

           If the function succeeds, the number of bytes in the message is returned. Otherwise, a
           "undef" is returned and "nn_errno" is set to to one of the values defined below.

           •   "EBADF" The provided socket is invalid.

           •   "ENOTSUP" The operation is not supported by this socket type.

           •   "EFSM" The operation cannot be performed on this socket at the moment because the
               socket is not in the appropriate state. This error may occur with socket types
               that switch between several states.

           •   "EAGAIN" Non-blocking mode was requested and the message cannot be sent at the
               moment.

           •   "EINTR" The operation was interrupted by delivery of a signal before the message
               was sent.

           •   "ETIMEDOUT" Individual socket types may define their own specific timeouts. If
               such timeout is hit, this error will be returned.

           •   "ETERM" The library is terminating.

       nn_recv($s, $data, $length=NN_MSG, $flags=0)
               my $bytes_received = nn_recv($s, my $buf, 256);
               die nn_errno unless defined $bytes_received;

           Receive a message from the socket $s and store it in the buffer $buf. Any bytes
           exceeding the length specified by the $length argument will be truncated.

           Alternatively, "nn_recv" can allocate a message buffer instance for you. To do so, set
           the $length parameter to "NN_MSG" (the default).

           The $flags argument, which defaults to 0, is a combination of the flags defined below:

           •   "NN_DONTWAIT" Specifies that the operation should be performed in non-blocking
               mode. If the message cannot be received straight away, the function will fail with
               "nn_errno" set to "EAGAIN".

           If the function succeeds number of bytes in the message is returned. Otherwise,
           "undef" is returned and "nn_errno" is set to to one of the values defined below.

           •   "EBADF" The provided socket is invalid.

           •   "ENOTSUP" The operation is not supported by this socket type.

           •   "EFSM" The operation cannot be performed on this socket at the moment because
               socket is not in the appropriate state. This error may occur with socket types
               that switch between several states.

           •   "EAGAIN" Non-blocking mode was requested and there's no message to receive at the
               moment.

           •   "EINTR" The operation was interrupted by delivery of a signal before the message
               was received.

           •   "ETIMEDOUT" Individual socket types may define their own specific timeouts. If
               such timeout is hit this error will be returned.

           •   "ETERM" The library is terminating.

       nn_sendmsg($s, $flags, $data1, $data2, ..., $dataN)
               my $bytes_sent = nn_sendmsg($s, 0, 'foo', 'bar');
               die nn_errno unless defined $bytes_sent;

           This function is a fine-grained alternative to "nn_send". It allows sending multiple
           data buffers that make up a single message without having to create another temporary
           buffer to hold the concatenation of the different message parts.

           The scalars containing the data to be sent ($data1, $data2, ..., $dataN) can either be
           anything that can be used as a byte string in perl or a message buffer instance
           allocated by "nn_allocmsg". In case of a message buffer instance the instance will be
           deallocated and invalidated by the "nn_sendmsg" function. The buffers will be a
           instances of "NanoMsg::Raw::Message::Freed" after the call to "nn_sendmsg".

           When using message buffer instances, only one buffer may be provided.

           To which of the peers will the message be sent to is determined by the particular
           socket type.

           The $flags argument is a combination of the flags defined below:

           •   "NN_DONTWAIT" Specifies that the operation should be performed in non-blocking
               mode. If the message cannot be sent straight away, the function will fail with
               "nn_errno" set to "EAGAIN".

           If the function succeeds number of bytes in the message is returned. Otherwise,
           "undef" is returned and "nn_errno" is set to to one of the values defined below.

           •   "EBADF" The provided socket is invalid.

           •   "ENOTSUP" The operation is not supported by this socket type.

           •   "EFSM" The operation cannot be performed on this socket at the moment because
               socket is not in the appropriate state. This error may occur with socket types
               that switch between several states.

           •   "EAGAIN" Non-blocking mode was requested and the message cannot be sent at the
               moment.

           •   "EINTR" The operation was interrupted by delivery of a signal before the message
               was sent.

           •   "ETIMEDOUT" Individual socket types may define their own specific timeouts. If
               such timeout is hit this error will be returned.

           •   "ETERM" The library is terminating.

           In the future, "nn_sendmsg" might allow for sending along additional control data.

       nn_recvmsg($s, $flags, $data1 => $len1, $data2 => $len2, ..., $dataN => $lenN)
               my $bytes_received = nn_recvmsg($s, 0, my $buf1 => 256, my $buf2 => 1024);
               die nn_errno unless defined $bytes_received;

           This function is a fine-grained alternative to "nn_recv". It allows receiving a single
           message into multiple data buffers of different sizes, eliminating the need to create
           copies of part of the received message in some cases.

           The scalars in which to receive the message data ($buf1, $buf2, ..., $bufN) will be
           filled with as many bytes of data as is specified by the length parameter following
           them in the argument list ($len1, $len2, ..., $lenN).

           Alternatively, "nn_recvmsg" can allocate a message buffer instance for you. To do so,
           set the length parameter of a buffer to to "NN_MSG". In this case, only one receive
           buffer can be provided.

           The $flags argument is a combination of the flags defined below:

           •   "NN_DONTWAIT" Specifies that the operation should be performed in non-blocking
               mode. If the message cannot be received straight away, the function will fail with
               "nn_errno" set to "EAGAIN".

           In the future, "nn_recvmsg" might allow for receiving additional control data.

       nn_allocmsg($size, $type)
               my $msg = nn_allocmsg(3, 0) or die nn_errno;
               $msg->copy('foo');
               nn_send($s, $msg);

           Allocate a message of the specified $size to be sent in zero-copy fashion. The content
           of the message is undefined after allocation and it should be filled in by the user.
           While "nn_send" and "nn_sendmsg" allow one to send arbitrary buffers, buffers
           allocated using "nn_allocmsg" can be more efficient for large messages as they allow
           for using zero-copy techniques.

           The $type parameter specifies type of allocation mechanism to use. Zero is the default
           one. However, individual transport mechanisms may define their own allocation
           mechanisms, such as allocating in shared memory or allocating a memory block pinned
           down to a physical memory address. Such allocation, when used with the transport that
           defines them, should be more efficient than the default allocation mechanism.

           If the function succeeds a newly allocated message buffer instance (an object instance
           of the class NanoMsg::Raw::Message) is returned. Otherwise, "undef" is returned and
           "nn_errno" is set to to one of the values defined below.

           •   "EINVAL" Supplied allocation type is invalid.

           •   "ENOMEM" Not enough memory to allocate the message.

       nn_errno()
           Returns value of "errno" after the last call to any nanomsg function in the current
           thread. This function can be used in the same way the $! global variable is be used
           for many other system and library calls.

           The return value can be used in numeric context, for example to compare it with error
           code constants such as "EAGAIN", or in a string context, to retrieve a textual message
           describing the error.

       nn_strerror($errno)
           Returns a textual representation of the error described by the nummeric $errno
           provided. It shouldn't normally be necessary to ever call this function, as using
           "nn_errno" in string context is basically equivalent to "nn_strerror(nn_errno)".

       nn_device($s1, $s2)
               nn_device($s1, $s2) or die;

           Starts a device to forward messages between two sockets. If both sockets are valid,
           the "nn_device" function loops and sends and messages received from $s1 to $s2 and
           vice versa. If only one socket is valid and the other is "undef", "nn_device" works in
           a loopback mode - it loops and sends any messages received from the socket back to
           itself.

           The function loops until it hits an error. In such case it returns "undef" and sets
           "nn_errno" to one of the values defined below.

           •   "EBADF" One of the provided sockets is invalid.

           •   "EINVAL" Either one of the socket is not an "AF_SP_RAW" socket; or the two sockets
               don't belong to the same protocol; or the directionality of the sockets doesn't
               fit (e.g. attempt to join two SINK sockets to form a device).

           •   "EINTR" The operation was interrupted by delivery of a signal.

           •   "ETERM" The library is terminating.

       nn_term()
               nn_term();

           To help with shutdown of multi-threaded programs the "nn_term" function is provided.
           It informs all the open sockets that process termination is underway.

           If a socket is blocked inside a blocking function, such as "nn_recv", it will be
           unblocked and the "ETERM" error will be returned to the user. Similarly, any
           subsequent attempt to invoke a socket function other than "nn_close" after "nn_term"
           was called will result in an "ETERM" error.

           If waiting for "NN_SNDFD" or "NN_RCVFD" using a polling function, such as "poll" or
           "select", the call will unblock with both "NN_SNDFD" and "NN_RCVFD" signaled.

           The "nn_term" function itself is non-blocking.

Protocols

   One-to-one protocol
       Pair protocol is the simplest and least scalable scalability protocol. It allows scaling
       by breaking the application in exactly two pieces. For example, if a monolithic
       application handles both accounting and agenda of HR department, it can be split into two
       applications (accounting vs. HR) that are run on two separate servers. These applications
       can then communicate via PAIR sockets.

       The downside of this protocol is that its scaling properties are very limited. Splitting
       the application into two pieces allows one to scale to two servers. To add the third
       server to the cluster, application has to be split once more, say be separating HR
       functionality into hiring module and salary computation module. Whenever possible, try to
       use one of the more scalable protocols instead.

       Socket Types

       •   "NN_PAIR" Socket for communication with exactly one peer. Each party can send messages
           at any time. If the peer is not available or send buffer is full subsequent calls to
           "nn_send" will block until it's possible to send the message.

       Socket Options

       No protocol-specific socket options are defined at the moment.

   Request/reply protocol
       This protocol is used to distribute the workload among multiple stateless workers.

       Socket Types

       •   "NN_REQ" Used to implement the client application that sends requests and receives
           replies.

       •   "NN_REP" Used to implement the stateless worker that receives requests and sends
           replies.

       Socket Options

       •   "NN_REQ_RESEND_IVL" This option is defined on the full REQ socket. If a reply is not
           received in specified amount of milliseconds, the request will be automatically
           resent. The type of this option is int. Default value is 60000 (1 minute).

   Publish/subscribe protocol
       Broadcasts messages to multiple destinations.

       Socket Types

       •   "NN_PUB" This socket is used to distribute messages to multiple destinations. Receive
           operation is not defined.

       •   "NN_SUB" Receives messages from the publisher. Only messages that the socket is
           subscribed to are received. When the socket is created there are no subscriptions and
           thus no messages will be received. Send operation is not defined on this socket.

       Socket Options

       •   "NN_SUB_SUBSCRIBE" Defined on full SUB socket. Subscribes for a particular topic. Type
           of the option is string.

       •   "NN_SUB_UNSUBSCRIBE" Defined on full SUB socket. Unsubscribes from a particular topic.
           Type of the option is string.

   Survey protocol
       allows one to broadcast a survey to multiple locations and gather the responses.

       Socket Types

       •   "NN_SURVEYOR" Used to send the survey. The survey is delivered to all the connected
           respondents. Once the query is sent, the socket can be used to receive the responses.
           When the survey deadline expires, receive will return the "ETIMEDOUT" error.

       •   "NN_RESPONDENT" Use to respond to the survey. Survey is received using receive
           function, response is sent using send function. This socket can be connected to at
           most one peer.

       Socket Options

       •   "NN_SURVEYOR_DEADLINE" Specifies how long to wait for responses to the survey. Once
           the deadline expires, receive function will return the "ETIMEDOUT" error and all
           subsequent responses to the survey will be silently dropped. The deadline is measured
           in milliseconds. Option type is int. Default value is 1000 (1 second).

   Pipeline protocol
       Fair queues messages from the previous processing step and load balances them among
       instances of the next processing step.

       Socket Types

       •   "NN_PUSH" This socket is used to send messages to a cluster of load-balanced nodes.
           Receive operation is not implemented on this socket type.

       •   "NN_PULL" This socket is used to receive a message from a cluster of nodes. Send
           operation is not implemented on this socket type.

       Socket Options

       No protocol-specific socket options are defined at the moment.

   Message bus protocol
       Broadcasts messages from any node to all other nodes in the topology. The socket should
       never receives messages that it sent itself.

       This pattern scales only to local level (within a single machine or within a single LAN).
       Trying to scale it further can result in overloading individual nodes with messages.

       WARNING: For bus topology to function correctly, the user is responsible for ensuring that
       path from each node to any other node exists within the topology.

       Raw ("AF_SP_RAW") BUS socket never send the message to the peer it was received from.

       Socket Types

       •   "NN_BUS" Sent messages are distributed to all nodes in the topology. Incoming messages
           from all other nodes in the topology are fair-queued in the socket.

       Socket Options

       There are no options defined at the moment.

Transports

   In-process transport
       The in-process transport allows one to send messages between threads or modules inside a
       process. In-process address is an arbitrary case-sensitive string preceded by "inproc://"
       protocol specifier. All in-process addresses are visible from any module within the
       process. They are not visible from outside of the process.

       The overall buffer size for an inproc connection is determined by the "NN_RCVBUF" socket
       option on the receiving end of the connection. The "NN_SNDBUF" socket option is ignored.
       In addition to the buffer, one message of arbitrary size will fit into the buffer. That
       way, even messages larger than the buffer can be transferred via inproc connection.

       This transport's ID is "NN_INPROC".

   Inter-process transport
       The inter-process transport allows for sending messages between processes within a single
       box. The implementation uses native IPC mechanism provided by the local operating system
       and the IPC addresses are thus OS-specific.

       On POSIX-compliant systems, UNIX domain sockets are used and IPC addresses are file
       references. Note that both relative ("ipc://test.ipc") and absolute
       ("ipc:///tmp/test.ipc") paths may be used. Also note that access rights on the IPC files
       must be set in such a way that the appropriate applications can actually use them.

       On Windows, named pipes are used for IPC. IPC address is an arbitrary case-insensitive
       string containing any character except for backslash. Internally, address "ipc://test"
       means that named pipe "\\.\pipe\test" will be used.

       This transport's ID is "NN_IPC".

   TCP transport
       The TCP transport allows for passing message over the network using simple reliable one-
       to-one connections. TCP is the most widely used transport protocol, it is virtually
       ubiquitous and thus the transport of choice for communication over the network.

       When binding a TCP socket address of the form "tcp://interface:port" should be used. Port
       is the TCP port number to use. Interface is one of the following (optionally placed within
       square brackets):

       •   Asterisk character (*) meaning all local network interfaces.

       •   IPv4 address of a local network interface in numeric form (192.168.0.111).

       •   IPv6 address of a local network interface in numeric form (::1).

       •   Interface name, as defined by operating system.

       When connecting a TCP socket address of the form "tcp://interface;address:port" should be
       used. Port is the TCP port number to use. Interface is optional and specifies which local
       network interface to use. If not specified, OS will select an appropriate interface
       itself. If specified it can be one of the following (optionally placed within square
       brackets):

       •   IPv4 address of a local network interface in numeric form (192.168.0.111).

       •   IPv6 address of a local network interface in numeric form (::1).

       •   Interface name, as defined by operating system (eth0).

       Finally, address specifies the remote address to connect to. It can be one of the
       following (optionally placed within square brackets):

       •   IPv4 address of a remote network interface in numeric form (192.168.0.111).

       •   IPv6 address of a remote network interface in numeric form (::1).

       •   The DNS name of the remote box.

       This transport's ID is "NN_TCP".

       Socket Options

       •   "NN_TCP_NODELAY" This option, when set to 1, disables Nagle's algorithm. It also
           disables delaying of TCP acknowledgments. Using this option improves latency at the
           expense of throughput. Type of this option is int. The default value is 0.

Constants

       In addition to all the error constants and "NN_" constants used in the documentation of
       the individual functions, protocols, and transports, the following constants are
       available:

       •   "NN_VERSION_CURRENT" The current interface version.

       •   "NN_VERSION_REVISION" The latest revision of the current interface.

       •   "NN_VERSION_AGE" How many past interface versions are still supported.

SEE ALSO

       •   The nanomsg C library documentation at <http://nanomsg.org/v0.1/nanomsg.7.html> The
           API this module provides is very close to the C library's interface, so the C
           documentation is likely to be useful to developers using Perl, too. Additionally, most
           of this module's documentation is copied from the C library documentation, so the
           upstream documentation might be somewhat more recent.

       •   NanoMsg::Raw::Message