1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
## nng_ctx_open
Create context.
### Synopsis
```c
#include <nng/nng.h>
int nng_ctx_open(nng_ctx *ctxp, nng_socket s);
```
### Description
The `nng_ctx_open` function creates a separate ((context)) to be used with the socket _s_, and returns it at the location pointed by _ctxp_.
Only stateful protocols support creation of separate contexts.footnote:[Stateless protocols by their very nature have no need for contexts.]
Contexts allow the independent and concurrent use of stateful operations using the same socket.footnote:[For example, two different contexts created on a xref:../proto/rep.adoc[_rep_] socket can each receive requests, and send replies to them, without any regard to or interference with each other.]
TIP: Using contexts is an excellent way to write simpler concurrent applications, while retaining the benefits of the protocol-specific
advanced processing, avoiding the need to bypass that with xref:nng.adoc#raw_mode[raw mode](((raw mode))) sockets.footnote:[Use of contexts with xref:nng.adoc#raw_mode[raw mode] sockets is nonsensical, and not supported.]
### Return Values
This function returns 0 on success, and non-zero otherwise.
### Errors
[horizontal]
`NNG_ENOMEM`:: Insufficient memory is available.
`NNG_ENOTSUP`:: The protocol does not support separate contexts, or the socket was opened in raw mode.
### See Also
xref:nng_ctx_close.adoc[nng_ctx_close],
xref:nng_ctx_get.adoc[nng_ctx_get],
xref:nng_ctx_recv.adoc[nng_ctx_recv],
xref:nng_ctx_send.adoc[nng_ctx_send],
xref:nng_ctx_set.adoc[nng_ctx_set]
|