= nng_recv(3) // // Copyright 2018 Staysail Systems, Inc. // Copyright 2018 Capitar IT Group BV // // This document is supplied under the terms of the MIT License, a // copy of which should be located in the distribution where this // file was obtained (LICENSE.txt). A copy of the license may also be // found online at https://opensource.org/licenses/MIT. // == NAME nng_recv - recv data == SYNOPSIS [source, c] ---- #include int nng_recv(nng_socket s, void *data, size_t *sizep, int flags); ---- == DESCRIPTION The `nng_recv()` receives a message. The _flags_ is a bit mask that may contain any of the following values: `NNG_FLAG_NONBLOCK`:: The function returns immediately, even if no message is available. Without this flag, the function will wait until a message is received by the socket _s_, or any configured timer expires. `NNG_FLAG_ALLOC`:: If this flag is present, then a ((zero-copy)) mode is used. In this case the caller must set the value of _data_ to the location of another pointer (of type `void *`), and the _sizep_ pointer must be set to a location to receive the size of the message body. The function will then allocate a message buffer (as if by xref:nng_alloc.3.adoc[`nng_alloc()`]), fill it with the message body, and store it at the address referenced by _data_, and update the size referenced by _sizep_. The caller is responsible for disposing of the received buffer either by the xref:nng_free.3.adoc[`nng_free()`] function or passing the message (also with the `NNG_FLAG_ALLOC` flag) in a call to xref:nng_send.3.adoc[`nng_send()`]. If the special flag `NNG_FLAG_ALLOC` (see above) is not specified, then the caller must set _data_ to a buffer to receive the message body content, and must store the size of that buffer at the location pointed to by _sizep_. When the function returns, if it is successful, the size at _sizep_ will be updated with the actual message body length copied into _data_. NOTE: The semantics of what receiving a message means vary from protocol to protocol, so examination of the protocol documentation is encouraged. (For example, with a xref:nng_req.7.adoc[_req_] socket a message may only be received after a request has been sent, and a xref:nng_sub.7.adoc[_sub_] socket may only receive messages corresponding to topics to which it has subscribed.) Furthermore, some protocols may not support receiving data at all, such as xref:nng_pub.7.adoc[_pub_]. TIP: The `NNG_FLAG_ALLOC` flag can be used to reduce data copies, thereby increasing performance, particularly if the buffer is reused to send a response using the same flag. == RETURN VALUES This function returns 0 on success, and non-zero otherwise. == ERRORS [horizontal] `NNG_EAGAIN`:: The operation would block, but `NNG_FLAG_NONBLOCK` was specified. `NNG_ECLOSED`:: The socket _s_ is not open. `NNG_EINVAL`:: An invalid set of _flags_ was specified. `NNG_EMSGSIZE`:: The received message did not fit in the size provided. `NNG_ENOMEM`:: Insufficient memory is available. `NNG_ENOTSUP`:: The protocol for socket _s_ does not support receiving. `NNG_ESTATE`:: The socket _s_ cannot receive data in this state. `NNG_ETIMEDOUT`:: The operation timed out. == SEE ALSO [.text-left] xref:nng_alloc.3.adoc[nng_alloc(3)], xref:nng_free.3.adoc[nng_free(3)], xref:nng_recvmsg.3.adoc[nng_recvmsg(3)], xref:nng_send.3.adoc[nng_send(3)], xref:nng_strerror.3.adoc[nng_strerror(3)], xref:nng.7.adoc[nng(7)]