= nng_rep(7)
//
// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech>
// Copyright 2018 Capitar IT Group BV <info@capitar.com>
//
// 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_rep - reply protocol

== SYNOPSIS

[source,c]
----
#include <nng/protocol/reqrep0/rep.h>
----

== DESCRIPTION

(((protocol, _rep_)))
The ((_rep_ protocol)) is one half of a ((request/reply pattern)).
In this pattern, a requester sends a message to one replier, who
is expected to reply.
The request is resent if no reply arrives,
until a reply is received or the request times out.

TIP: This protocol is useful in setting up RPC-like services.
It is also reliable, in that a the requester will keep retrying until
a reply is received.

The _rep_ protocol is the replier side, and the
xref:nng_req.7.adoc[_req_] protocol is the requester side.

=== Socket Operations

The xref:nng_rep_open.3.adoc[`nng_rep0_open()`] functions create a replier socket.
This socket may be used to receive messages (requests), and then to send
replies.

Generally a reply can only be sent after receiving a request.

Send operations will result in `NNG_ESTATE` if no corresponding request
was previously received.

Likewise, only one receive operation may be pending at a time.
Any additional concurrent receive operations will result in `NNG_ESTATE`.

xref:nng.7.adoc#raw_mode[Raw] mode sockets ignore all these restrictions.

=== Context Operations

This protocol supports the creation of xref:nng_ctx.5.adoc[contexts] for concurrent
use cases using xref:nng_ctx_open.3.adoc[`nng_ctx_open()`].

Each context may have at most one outstanding request, and operates
independently from the others.
The restrictions for order of operations with sockets apply equally
well for contexts, except that each context will be treated as if it were
a separate socket.

=== Protocol Versions

Only version 0 of this protocol is supported.
(At the time of writing, no other versions of this protocol have been defined.)

==== Protocol Options

The _rep_ protocol has no protocol-specific options.

==== Protocol Headers

(((backtrace)))
The _rep_ protocol uses a _backtrace_ in the header.
This is more fully documented in the xref:nng_req.7.adoc[_req_] manual.

== SEE ALSO

[.text-left]
xref:nng_rep_open.3.adoc[nng_rep_open(3)],
xref:nng.7.adoc[nng(7)],
xref:nng_req.7.adoc[nng_req(7)]
