---
name: "nng_recv"
section: "3"
platform: "linux"
package: "libnng-dev"
version: "1.10.1-2"
release: "Debian 13 (Trixie)"
platforms: ["linux"]
url: "https://new.carta.tech/nng_recv"
---

# nng\_recv(3)

recv data

## NAME

nng\_recv - recv data

## SYNOPSIS

```
#include <nng/nng.h>
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 `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 `nng_free()` function or passing the message (also with the `NNG_FLAG_ALLOC` flag) in a call to `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 `NNG_FLAG_ALLOC` flag is deprecated and may be removed in a future release. Applications should use `nng_recvmsg()` for zero copy performance improvements.

**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 *req* socket a message may only be received after a request has been sent, and a *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 *pub*.

## RETURN VALUES

This function returns 0 on success, and non-zero otherwise.

## ERRORS

`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

[nng\_alloc(3)](/nng_alloc/3.md), [nng\_free(3)](/nng_free/3.md), [nng\_recvmsg(3)](/nng_recvmsg/3.md), [nng\_send(3)](/nng_send/3.md), [nng\_strerror(3)](/nng_strerror/3.md), [nng(7)](/nng/7.md)
