diff options
Diffstat (limited to 'ref/print.html')
| -rw-r--r-- | ref/print.html | 303 |
1 files changed, 299 insertions, 4 deletions
diff --git a/ref/print.html b/ref/print.html index b7725ff0..bf6fd41d 100644 --- a/ref/print.html +++ b/ref/print.html @@ -3462,6 +3462,246 @@ referenced by <em>valp</em>.</p> are available, and which type they may be accessed using.</p> <p>In the case of <code>nng_stream_get_string</code>, the string is created as if by <a href="api//api/memory.html#duplicate-string"><code>nng_strdup</code></a>, and must be freed by the caller using <a href="api//api/memory.html#free-string"><code>nng_strfree</code></a> when no longer needed.</p> +<h2 id="stream-factories"><a class="header" href="#stream-factories">Stream Factories</a></h2> +<pre><code class="language-c">typedef struct nng_stream_dialer nng_stream_dialer; +typedef struct nng_stream_listener nng_stream_listener; +</code></pre> +<p><a name="a015"></a> +The <a name="a016"></a><code>nng_stream_listener</code> object and <a name="a017"></a><code>nng_stream_listener</code> objects can be thought of as factories that +create <a href="api//api/stream.html#stream-type"><code>nng_stream</code></a> streams.</p> +<p>The <code>nng_stream_listener</code> object a handle to a listener, which creates streams by accepting incoming connection requests. +In a BSD socket implementation, this is the entity responsible for doing <a name="a018"></a><code>bind</code>, <a name="a019"></a><code>listen</code> and <a name="a020"></a><code>accept</code>. +Normally a listener may be used to accept multiple, possibly many, concurrent connections.</p> +<p>The <code>nng_stream_dialer</code> object is a handle to a dialer, which creates streams by making outgoing +connection requests. While there isn’t a specific BSD socket analogue, this can be thought of as a factory for TCP sockets +created by opening them with <a name="a021"></a><code>socket</code> and then calling <a name="a022"></a><code>connect</code> on them.</p> +<h2 id="creating-a-stream-factory"><a class="header" href="#creating-a-stream-factory">Creating a Stream Factory</a></h2> +<pre><code class="language-c">int nng_stream_dialer_alloc(nng_stream_dialer **dialerp, const char *url); +int nng_stream_dialer_alloc_url(nng_stream_dialer **dialerp, const nng_url *url); +int nng_stream_listener_alloc(nng_stream_listener **lstenerp, const char *url); +int nng_stream_listener_alloc_url(nng_stream_listener **listenerp, const nng_url *url); +</code></pre> +<p>The <a name="a023"></a><code>nng_stream_dialer_alloc</code> and <a name="a024"></a><code>nng_stream_dialer_alloc_url</code> functions create a stream dialer, associated the +<a name="a025"></a>URL specified by <em>url</em> represented as a string, or as an <a href="api//api/url.html#url-structure"><code>nng_url</code></a> object, respectively. The dialer is returned in the location +<em>dialerp</em> references.</p> +<p>The <a name="a026"></a><code>nng_stream_listener_alloc</code> and <a name="a027"></a><code>nng_stream_listener_alloc_url</code> functions create a stream listener, associated the +URL specified by <em>url</em> represented as a string, or as an <a href="api//api/url.html#url-structure"><code>nng_url</code></a> object, respectively. The listener is returned in the location +<em>listenerp</em> references.</p> +<h3 id="example-1-creating-a-tcp-listener"><a class="header" href="#example-1-creating-a-tcp-listener">Example 1: Creating a TCP Listener</a></h3> +<p>This shows creating a TCP listener that listens on <code>INADDR_ANY</code>, port 444.</p> +<pre><code class="language-c">nng_listener listener; +int rv = nng_stream_listener_alloc(&listener, "tcp://:444"); +</code></pre> +<h2 id="closing-a-stream-factory"><a class="header" href="#closing-a-stream-factory">Closing a Stream Factory</a></h2> +<pre><code class="language-c">void nng_stream_dialer_close(nng_stream_listener *dialer); +void nng_stream_dialer_stop(nng_stream_listener *dialer); +void nng_stream_dialer_free(nng_stream_listener *dialer); +void nng_stream_listener_close(nng_stream_listener *listener); +void nng_stream_listener_stop(nng_stream_listener *listener); +void nng_stream_listener_free(nng_stream_listener *listener); +</code></pre> +<p>The <a name="a028"></a><code>nng_stream_dialer_close</code> and <a name="a029"></a><code>nng_stream_listener_close</code> functions close the stream <em>dialer</em> or <em>listener</em>, +preventing it from creating new connections. +This will generally include closing any underlying file used for creating such connections. +However, some requests may still be pending when this function returns, as it does not wait for the shutdown to complete.</p> +<p>The <a name="a030"></a><code>nng_stream_dialer_stop</code> and <a name="a031"></a><code>nng_stream_listener_stop</code> functions performs the same action, +but also wait until all outstanding requests are serviced, and the <em>dialer</em> or <em>listener</em> is completely stopped. +Because they blocks, these functions must not be called in contexts where blocking is not allowed.</p> +<p>The <a name="a032"></a><code>nng_stream_dialer_free</code> and <a name="a033"></a><code>nng_stream_listener_free</code> function performs the same action as +<code>nng_stream_dialer_stop</code> or <code>nng_stream_listener_stop</code>, but also deallocates the <em>dialer</em> or <em>listener</em>, and any associated resources.</p> +<div class="mdbook-alerts mdbook-alerts-tip"> +<p class="mdbook-alerts-title"> + <span class="mdbook-alerts-icon"></span> + tip +</p> +<p>A best practice for shutting down an application safely is to stop everything <em>before</em> deallocating. This ensures that no +callbacks are running that could reference an object after it is deallocated.</p> +</div> +<h2 id="making-outgoing-connections"><a class="header" href="#making-outgoing-connections">Making Outgoing Connections</a></h2> +<pre><code class="language-c">void nng_stream_dialer_dial(nng_stream_dialer *dialer, nng_aio *aio); +</code></pre> +<p>The <a name="a034"></a><code>nng_stream_dialer_dial</code> initiates an outgoing connection asynchronously, using the <a href="api//api/aio.html#asynchronous-io-handle"><code>nng_aio</code></a> <em>aio</em>. +If it successfully establishes a connection, it creates an <a href="api//api/stream.html#stream-type"><code>nng_stream</code></a>, which can be obtained as the first +output result on <em>aio</em> using the <a href="api//api/aio.html#inputs-and-outputs"><code>nng_aio_get_output</code></a> function with index zero.</p> +<div class="mdbook-alerts mdbook-alerts-tip"> +<p class="mdbook-alerts-title"> + <span class="mdbook-alerts-icon"></span> + tip +</p> +<p>An <a href="api//api/stream.html#stream-factories"><code>nng_stream_dialer</code></a> can be used multiple times to make multiple concurrent connection requests, but +they all must reference the same URL.</p> +</div> +<h3 id="example-3-connecting-to-google"><a class="header" href="#example-3-connecting-to-google">Example 3: Connecting to Google</a></h3> +<p>This demonstrates making an outbound connection to “google.com” on TCP port 80. +Error handling is elided for clarity.</p> +<pre><code class="language-c">nng_aio *aio; +nng_stream_dialer *dialer; +nng_stream *stream; + +nng_stream_dialer_alloc(&dialer, "tcp://google.com:80"); + +nng_aio_alloc(&aio, NULL, NULL); + +// make a single outbound connection +nng_stream_dialer_dial(dialer, aio); +nng_aio_wait(aio); // wait for the asynch operation to complete +if (nng_aio_result(aio) != 0) { + // ... handle the error +} +stream = nng_aio_get_output(aio, 0); +</code></pre> +<h2 id="accepting-incoming-connections"><a class="header" href="#accepting-incoming-connections">Accepting Incoming Connections</a></h2> +<pre><code class="language-c">int nng_stream_listener_listen(nng_stream_listener *listener); +void nng_stream_listener_accept(nng_stream_listener *listener, nng_aio *aio); +</code></pre> +<p>Accepting incoming connections is performed in two steps. The first step, <a name="a035"></a><code>nng_stream_listener_listen</code> is to setup for +listening. For a TCP implementation of this, for example, this would perform the <code>bind</code> and the <code>listen</code> steps. This will bind +to the address represented by the URL that was specific when the listener was created with <a href="api//api/stream.html#creating-a-stream-factory"><code>nng_stream_listener_alloc</code></a>.</p> +<p>In the second step, <a name="a036"></a><code>nng_stream_listener_accept</code> accepts an incoming connection on <em>listener</em> asynchronously, using the <a href="api//api/aio.html#asynchronous-io-handle"><code>nng_aio</code></a> <em>aio</em>. +If an incoming connection is accepted, it will be represented as an <a href="api//api/stream.html#stream-type"><code>nng_stream</code></a>, which can be obtained from the <em>aio</em> as the first +output result using the <a href="api//api/aio.html#inputs-and-outputs"><code>nng_aio_get_output</code></a> function with index zero.</p> +<h3 id="example-3-accepting-an-inbound-stream"><a class="header" href="#example-3-accepting-an-inbound-stream">Example 3: Accepting an Inbound Stream</a></h3> +<p>For clarity this example uses a synchronous approach using <a href="api//api/aio.html#wait-for-completion"><code>nng_aio_wait</code></a>, but a typical server application +would most likely use a callback to accept the incoming stream, and start another instance of <code>nng_stream_listener_accept</code>.</p> +<pre><code class="language-c">nng_aio *aio; +nng_listener *listener; +nng_stream *stream; + +nng_stream_listener_alloc(&listener, "tcp://:8181"); +nng_aio_alloc(&aio, NULL, NULL); // normally would use a callback + +// listen (binding to the URL in the process) +if (nng_stream_listener_listen(listener)) { + // ... handle the error +} + +// now accept a single incoming connection as a stream object +nng_stream_listener_accept(l, aio); +nng_aio_wait(aio); // wait for the asynch operation to complete +if (nng_aio_result(aio) != 0) { + // ... handle the error +} +stream = nng_aio_get_output(aio, 0); +</code></pre> +<h2 id="stream-factory-options"><a class="header" href="#stream-factory-options">Stream Factory Options</a></h2> +<pre><code class="language-c">int nng_stream_dialer_get_bool(nng_stream_dialer *dialer, const char *opt, bool *valp); +int nng_stream_dialer_get_int(nng_stream_dialer *dialer, const char *opt, int *valp); +int nng_stream_dialer_get_ms(nng_stream_dialer *dialer, const char *opt, nng_duration *valp); +int nng_stream_dialer_get_size(nng_stream_dialer *dialer, const char *opt, size_t *valp); +int nng_stream_dialer_get_addr(nng_stream_dialer *dialer, const char *opt, nng_sockaddr *valp); +int nng_stream_dialer_get_string(nng_stream_dialer *dialer, const char *opt, char **valp); +int nng_stream_dialer_get_uint64(nng_stream_dialer *dialer, const char *opt, uint64_t *valp); + +int nng_stream_listener_get_bool(nng_stream_listener *listener, const char *opt, bool *valp); +int nng_stream_listener_get_int(nng_stream_listener *listener, const char *opt, int *valp); +int nng_stream_listener_get_ms(nng_stream_listener *listener, const char *opt, nng_duration *valp); +int nng_stream_listener_get_size(nng_stream_listener *listener, const char *opt, size_t *valp); +int nng_stream_listener_get_addr(nng_stream_listener *listener, const char *opt, nng_sockaddr *valp); +int nng_stream_listener_get_string(nng_stream_listener *listener, const char *opt, char **valp); +int nng_stream_listener_get_uint64(nng_stream_listener *listener, const char *opt, uint64_t *valp); + +int nng_stream_dialer_set_bool(nng_stream_dialer *dialer, const char *opt, bool val); +int nng_stream_dialer_set_int(nng_stream_dialer *dialer, const char *opt, int val); +int nng_stream_dialer_set_ms(nng_stream_dialer *dialer, const char *opt, nng_duration val); +int nng_stream_dialer_set_size(nng_stream_dialer *dialer, const char *opt, size_t val); +int nng_stream_dialer_set_string(nng_stream_dialer *dialer, const char *opt, const char *val); +int nng_stream_dialer_set_uint64(nng_stream_dialer *dialer, const char *opt, uint64_t val); +int nng_stream_dialer_set_addr(nng_stream_dialer *dialer, const char *opt, const nng_sockaddr *val); + +int nng_stream_listener_set_bool(nng_stream_listener *listener, const char *opt, bool val); +int nng_stream_listener_set_int(nng_stream_listener *listener, const char *opt, int val); +int nng_stream_listener_set_ms(nng_stream_listener *listener, const char *opt, nng_duration val); +int nng_stream_listener_set_size(nng_stream_listener *listener, const char *opt, size_t val); +int nng_stream_listener_set_string(nng_stream_listener *listener, const char *opt, const char *val); +int nng_stream_listener_set_uint64(nng_stream_listener *listener, const char *opt, uint64_t val); +int nng_stream_listener_set_addr(nng_stream_listener *listener, const char *opt, const nng_sockaddr *val); +</code></pre> +<p><a name="a037"></a> +<a name="a038"></a> +<a name="a039"></a> +<a name="a040"></a> +<a name="a041"></a> +<a name="a042"></a> +<a name="a043"></a> +<a name="a044"></a> +<a name="a045"></a> +<a name="a046"></a> +<a name="a047"></a> +<a name="a048"></a> +<a name="a049"></a> +<a name="a050"></a> +<a name="a051"></a> +<a name="a052"></a> +<a name="a053"></a> +<a name="a054"></a> +<a name="a055"></a> +<a name="a056"></a> +<a name="a057"></a> +<a name="a058"></a> +<a name="a059"></a> +<a name="a060"></a> +<a name="a061"></a> +<a name="a062"></a> +<a name="a063"></a> +<a name="a064"></a> +These functions are used to retrieve or change the value of an option named <em>opt</em> from the stream <em>dialer</em> or <em>listener</em>. +The <code>nng_stream_dialer_get_</code> and <code>nng_stream_listener_get_</code> function families retrieve the value, and store it in the location <em>valp</em> references. +The <code>nng_stream_dialer_set_</code> and <code>nng_stream_listener_set_</code> function families change the value for the <em>dialer</em> or <em>listener</em>, taking it from <em>val</em>.</p> +<p>These functions access an option as a specific type. The transport layer will have details about which options +are available, and which type they may be accessed using.</p> +<p>In the case of <code>nng_stream_dialer_get_string</code> and <code>nng_stream_listener_get_string</code>, the string is created as if by <a href="api//api/memory.html#duplicate-string"><code>nng_strdup</code></a>, and must be freed by +the caller using <a href="api//api/memory.html#free-string"><code>nng_strfree</code></a> when no longer needed.</p> +<p>In the case of <code>nng_stream_dialer_set_string</code> and <code>nng_stream_listener_set_string</code>, the string contents are copied if necessary, so that the caller +need not retain the value referenced once the function returns.</p> +<p>In the case of <code>nng_stream_dialer_set_addr</code> and <code>nng_stream_listener_set_addr</code>, the contents of <em>addr</em> are copied if necessary, so that the caller +need not retain the value referenced once the function returns.</p> +<h3 id="example-4-socket-activation"><a class="header" href="#example-4-socket-activation">Example 4: Socket Activation<a name="socket-activation"></a></a></h3> +<p>Some <a href="api//api/stream.html#stream-factories"><code>nng_stream_listener</code></a> objects, depending on the underlying transport and platform, can support a technique known as “<a name="a065"></a>socket activation”, +where the file descriptor used for listening and accepting is supplied externally, such as by a system service manager. +In this case, the application supplies the file descriptor or <code>SOCKET</code> object using the <a name="a066"></a><code>NNG_OPT_LISTEN_FD</code> option, +instead of calling <a href="api//api/stream.html#accepting-incoming-connections"><code>nng_stream_listener_listen</code></a>.</p> +<div class="mdbook-alerts mdbook-alerts-tip"> +<p class="mdbook-alerts-title"> + <span class="mdbook-alerts-icon"></span> + tip +</p> +<p>Scalability Protocols transports based upon stream implementations that support socket activation can also benefit from this approach.</p> +</div> +<pre><code class="language-c">nng_stream_listener *listener; +int fd; + +// This is a systemd API, not part of NNG. +// See systemd documentation for an explanation. +// fd at this point has already had bind() and listen() called. +fd = SD_LISTEN_FDS_START + 0; + +nng_stream_listener_alloc(&listener, "tcp://"); +nng_stream_listener_set_int(listener, NNG_OPT_LISTEN_FD, fd); + +// can now start doing nng_stream_listener_accept... +</code></pre> +<h2 id="tls-configuration"><a class="header" href="#tls-configuration">TLS Configuration</a></h2> +<pre><code class="language-c">int nng_stream_dialer_get_tls(nng_stream_listener *dialer, nng_tls_config **tlsp); +int nng_stream_dialer_set_tls(nng_stream_listener *dialer, nng_tls_config *tls); +int nng_stream_listener_get_tls(nng_stream_listener *listener, nng_tls_config **tlsp); +int nng_stream_listener_set_tls(nng_stream_listener *listener, nng_tls_config *tls); +</code></pre> +<p>Both <a href="api//api/stream.html#stream-factories"><code>nng_stream_dialer</code></a> and <a href="api//api/stream.html#stream-factories"><code>nng_stream_listener</code></a> objects may support configuration of <a name="a067"></a>TLS parameters. +The <a name="a068"></a><code>nng_stream_dialer_set_tls</code> and <a name="a069"></a><code>nng_stream_listener_set_tls</code> functions support setting the +configuration of a <a href="api//TODO.html"><code>nng_tls_config</code></a> object supplied by <em>tls</em> on <em>dialer</em> or <em>listener</em>. +This must be performed before the <em>listener</em> starts listening with <a href="api//api/stream.html#accepting-incoming-connections"><code>nng_stream_listener_listen</code></a>, or the dialer starts an outgoing connection +as a result of <a href="api//api/stream.html#making-outgoing-connections"><code>nng_stream_dialer_dial</code></a>.</p> +<p>The configuration object that was previously established (which may be a default if one was not explicitly +configured) can be obtained with the <a name="a070"></a><code>nng_stream_dialer_get_tls</code> and <a name="a071"></a><code>nng_stream_listener_get_tls</code>. +They will return a pointer to the <a href="api//TODO.html"><code>nng_tls_config</code></a> object in question at the location referenced by <em>tlsp</em>.</p> +<div class="mdbook-alerts mdbook-alerts-note"> +<p class="mdbook-alerts-title"> + <span class="mdbook-alerts-icon"></span> + note +</p> +<p>TLS configuration cannot be changed once it has started being used by a listener or dialer. This applies to +both configuring a different TLS configuration object, as well as mutating the existing <a href="api//TODO.html"><code>nng_tls_config</code></a> object.</p> +</div> <!-- Symbol cross reference --> <!-- Macros --> <!-- Protocols --> @@ -6207,15 +6447,15 @@ can be simply removed from your application:</p> <code>NNG_OPT_WS_OPT_WS_REQUEST_HEADERS</code> and <code>NNG_OPT_WS_RESPONSE_HEADERS</code> have been removed. Just convert any use of them to <code>NNG_OPT_WS_REQUEST_HEADERS</code> or <code>NNG_OPT_WS_RESPONSE_HEADERS</code> as appropriate.</p> -<h2 id="tls-configuration"><a class="header" href="#tls-configuration">TLS Configuration</a></h2> +<h2 id="tls-configuration-1"><a class="header" href="#tls-configuration-1">TLS Configuration</a></h2> <p>The support for configuring TLS via <code>NNG_OPT_TLS_CONFIG</code>, <code>NNG_TLS_AUTH_MODE</code>, <code>NNG_OPT_TLS_CA_FILE</code>, <code>NNG_OPT_TLS_SERVER_NAME</code>, and similar has been removed.</p> <p>Instead configuration must be performed by allocating a <code>nng_tls_config</code> object, and then setting fields on it using the appropriate functions, after which it may be configured on a listener or dialer using the <a href="migrate//TODO.html"><code>nng_listener_set_tls</code></a> or <a href="migrate//TODO.html"><code>nng_dialer_set_tls</code></a> functions.</p> -<p>Likewise, when using the streams API, use the <a href="migrate//TODO.html"><code>nng_stream_listener_set_tls</code></a> or -<a href="migrate//TODO.html"><code>nng_stream_dialer_set_tls</code></a> functions.</p> +<p>Likewise, when using the streams API, use the <a href="migrate//api/stream.html#tls-configuration"><code>nng_stream_listener_set_tls</code></a> or +<a href="migrate//api/stream.html#tls-configuration"><code>nng_stream_dialer_set_tls</code></a> functions.</p> <p>Note that the declarations needed for TLS configuration are now available in <code><nng/nng.h></code>, rather than the supplemental header.</p> <h2 id="old-tls-versions-removed"><a class="header" href="#old-tls-versions-removed">Old TLS Versions Removed</a></h2> @@ -6580,6 +6820,7 @@ dialer before starting to dial.</p> <p>ABI, <a href="api/misc.html#a009">1</a><br/> abstract sockets, <a href="tran/ipc.html#a007">1</a><br/> <code>abstract://</code>, <a href="tran/ipc.html#a008">1</a><br/> +<code>accept</code>, <a href="api/stream.html#a020">1</a><br/> <code>AF_UNIX</code>, <a href="api/misc.html#a003">1</a><br/> aio, <a href="api/aio.html#a002">1</a><br/> allocations, <a href="api/memory.html#a002">1</a><br/> @@ -6588,6 +6829,7 @@ asynchronous I/O, <a href="api/aio.html#a003">1</a><br/> back-pressure, <a href="proto/index.html#a005">1</a><br/> backtrace, <a href="proto/rep.html#a004">1</a>, <a href="proto/req.html#a008">2</a>, <a href="proto/respondent.html#a004">3</a>, <a href="proto/surveyor.html#a008">4</a><br/> best-effort, <a href="proto/bus.html#a003">1</a><br/> +<code>bind</code>, <a href="api/stream.html#a018">1</a><br/> body, <a href="api/msg.html#a002">1</a><br/> <em>BUS</em>, <a href="proto/bus.html#a002">1</a><br/> <em>BUS</em> protocol, <a href="proto/bus.html#a001">1</a><br/> @@ -6596,6 +6838,7 @@ clock, <a href="api/time.html#a008">1</a><br/> command-line arguments, <a href="api/cmd_opts.html#a002">1</a><br/> concurrency, <a href="api/thread.html#a002">1</a><br/> condition variable, <a href="api/synch.html#a009">1</a><br/> +<code>connect</code>, <a href="api/stream.html#a022">1</a><br/> CPU-bound, <a href="api/thread.html#a003">1</a><br/> duration, <a href="api/time.html#a003">1</a><br/> error message, <a href="api/errors.html#a002">1</a><br/> @@ -6617,6 +6860,7 @@ intra-process, <a href="tran/inproc.html#a003">1</a><br/> IPv4, <a href="tran/udp.html#a003">1</a><br/> IPv6, <a href="tran/udp.html#a004">1</a><br/> leader election, <a href="proto/surveyor.html#a005">1</a><br/> +<code>listen</code>, <a href="api/stream.html#a019">1</a><br/> load-balancing, <a href="proto/pull.html#a004">1</a>, <a href="proto/push.html#a004">2</a>, <a href="proto/req.html#a005">3</a><br/> Log handlers, <a href="api/logging.html#a007">1</a><br/> memory, <a href="api/memory.html#a001">1</a><br/> @@ -6709,6 +6953,7 @@ named pipes, <a href="tran/ipc.html#a004">1</a><br/> <code>nng_mtx_lock</code>, <a href="api/synch.html#a004">1</a>, <a href="api/synch.html#a006">2</a><br/> <code>nng_mtx_unlock</code>, <a href="api/synch.html#a007">1</a><br/> <code>nng_null_logger</code>, <a href="api/logging.html#a010">1</a><br/> +<code>NNG_OPT_LISTEN_FD</code>, <a href="api/stream.html#a066">1</a><br/> <code>NNG_OPT_LOCADDR</code>, <a href="tran/ipc.html#a009">1</a><br/> <code>NNG_OPT_PEER_UID</code>, <a href="tran/ipc.html#a010">1</a><br/> <code>NNG_OPT_REQ_RESENDTICK</code>, <a href="proto/req.html#a007">1</a><br/> @@ -6782,6 +7027,28 @@ named pipes, <a href="tran/ipc.html#a004">1</a><br/> <code>nng_strdup</code>, <a href="api/memory.html#a005">1</a><br/> <code>nng_stream</code>, <a href="api/stream.html#a002">1</a><br/> <code>nng_stream_close</code>, <a href="api/stream.html#a005">1</a><br/> +<code>nng_stream_dialer_alloc</code>, <a href="api/stream.html#a023">1</a><br/> +<code>nng_stream_dialer_alloc_url</code>, <a href="api/stream.html#a024">1</a><br/> +<code>nng_stream_dialer_close</code>, <a href="api/stream.html#a028">1</a><br/> +<code>nng_stream_dialer_dial</code>, <a href="api/stream.html#a034">1</a><br/> +<code>nng_stream_dialer_free</code>, <a href="api/stream.html#a032">1</a><br/> +<code>nng_stream_dialer_get_addr</code>, <a href="api/stream.html#a041">1</a><br/> +<code>nng_stream_dialer_get_bool</code>, <a href="api/stream.html#a037">1</a><br/> +<code>nng_stream_dialer_get_int</code>, <a href="api/stream.html#a038">1</a><br/> +<code>nng_stream_dialer_get_ms</code>, <a href="api/stream.html#a039">1</a><br/> +<code>nng_stream_dialer_get_size</code>, <a href="api/stream.html#a040">1</a><br/> +<code>nng_stream_dialer_get_string</code>, <a href="api/stream.html#a042">1</a><br/> +<code>nng_stream_dialer_get_tls</code>, <a href="api/stream.html#a070">1</a><br/> +<code>nng_stream_dialer_get_uint64</code>, <a href="api/stream.html#a043">1</a><br/> +<code>nng_stream_dialer_set_addr</code>, <a href="api/stream.html#a048">1</a><br/> +<code>nng_stream_dialer_set_bool</code>, <a href="api/stream.html#a044">1</a><br/> +<code>nng_stream_dialer_set_int</code>, <a href="api/stream.html#a045">1</a><br/> +<code>nng_stream_dialer_set_ms</code>, <a href="api/stream.html#a046">1</a><br/> +<code>nng_stream_dialer_set_size</code>, <a href="api/stream.html#a047">1</a><br/> +<code>nng_stream_dialer_set_string</code>, <a href="api/stream.html#a049">1</a><br/> +<code>nng_stream_dialer_set_tls</code>, <a href="api/stream.html#a068">1</a><br/> +<code>nng_stream_dialer_set_uint64</code>, <a href="api/stream.html#a050">1</a><br/> +<code>nng_stream_dialer_stop</code>, <a href="api/stream.html#a030">1</a><br/> <code>nng_stream_free</code>, <a href="api/stream.html#a007">1</a><br/> <code>nng_stream_get_addr</code>, <a href="api/stream.html#a012">1</a><br/> <code>nng_stream_get_bool</code>, <a href="api/stream.html#a008">1</a><br/> @@ -6790,6 +7057,30 @@ named pipes, <a href="tran/ipc.html#a004">1</a><br/> <code>nng_stream_get_size</code>, <a href="api/stream.html#a011">1</a><br/> <code>nng_stream_get_string</code>, <a href="api/stream.html#a013">1</a><br/> <code>nng_stream_get_uint64</code>, <a href="api/stream.html#a014">1</a><br/> +<code>nng_stream_listener</code>, <a href="api/stream.html#a016">1</a>, <a href="api/stream.html#a017">2</a><br/> +<code>nng_stream_listener_accept</code>, <a href="api/stream.html#a036">1</a><br/> +<code>nng_stream_listener_alloc</code>, <a href="api/stream.html#a026">1</a><br/> +<code>nng_stream_listener_alloc_url</code>, <a href="api/stream.html#a027">1</a><br/> +<code>nng_stream_listener_close</code>, <a href="api/stream.html#a029">1</a><br/> +<code>nng_stream_listener_free</code>, <a href="api/stream.html#a033">1</a><br/> +<code>nng_stream_listener_get_addr</code>, <a href="api/stream.html#a055">1</a><br/> +<code>nng_stream_listener_get_bool</code>, <a href="api/stream.html#a051">1</a><br/> +<code>nng_stream_listener_get_int</code>, <a href="api/stream.html#a052">1</a><br/> +<code>nng_stream_listener_get_ms</code>, <a href="api/stream.html#a053">1</a><br/> +<code>nng_stream_listener_get_size</code>, <a href="api/stream.html#a054">1</a><br/> +<code>nng_stream_listener_get_string</code>, <a href="api/stream.html#a056">1</a><br/> +<code>nng_stream_listener_get_tls</code>, <a href="api/stream.html#a071">1</a><br/> +<code>nng_stream_listener_get_uint64</code>, <a href="api/stream.html#a057">1</a><br/> +<code>nng_stream_listener_listen</code>, <a href="api/stream.html#a035">1</a><br/> +<code>nng_stream_listener_set_addr</code>, <a href="api/stream.html#a062">1</a><br/> +<code>nng_stream_listener_set_bool</code>, <a href="api/stream.html#a058">1</a><br/> +<code>nng_stream_listener_set_int</code>, <a href="api/stream.html#a059">1</a><br/> +<code>nng_stream_listener_set_ms</code>, <a href="api/stream.html#a060">1</a><br/> +<code>nng_stream_listener_set_size</code>, <a href="api/stream.html#a061">1</a><br/> +<code>nng_stream_listener_set_string</code>, <a href="api/stream.html#a063">1</a><br/> +<code>nng_stream_listener_set_tls</code>, <a href="api/stream.html#a069">1</a><br/> +<code>nng_stream_listener_set_uint64</code>, <a href="api/stream.html#a064">1</a><br/> +<code>nng_stream_listener_stop</code>, <a href="api/stream.html#a031">1</a><br/> <code>nng_stream_recv</code>, <a href="api/stream.html#a004">1</a><br/> <code>nng_stream_send</code>, <a href="api/stream.html#a003">1</a><br/> <code>nng_stream_stop</code>, <a href="api/stream.html#a006">1</a><br/> @@ -6848,10 +7139,13 @@ request/reply pattern, <a href="proto/rep.html#a003">1</a>, <a href="proto/req.h scatter, <a href="api/aio.html#a023">1</a><br/> scheduling, <a href="api/time.html#a010">1</a><br/> service discovery, <a href="proto/surveyor.html#a006">1</a><br/> +<code>socket</code>, <a href="api/stream.html#a021">1</a><br/> socket, <a href="api/sock.html#a001">1</a><br/> +socket activation, <a href="api/stream.html#a065">1</a><br/> <em>socket</em> transport, <a href="tran/socket.html#a001">1</a><br/> <code>socket://</code>, <a href="tran/socket.html#a003">1</a><br/> statistics, <a href="api/stats.html#a001">1</a><br/> +stream factory, <a href="api/stream.html#a015">1</a><br/> streams, <a href="api/stream.html#a001">1</a><br/> <em>SUB</em>, <a href="proto/sub.html#a002">1</a><br/> <em>SUB</em> protocol, <a href="proto/sub.html#a001">1</a><br/> @@ -6863,13 +7157,14 @@ synchronization primitives, <a href="api/synch.html#a001">1</a><br/> threads, <a href="api/thread.html#a001">1</a><br/> thundering herd, <a href="api/synch.html#a016">1</a><br/> timeout, <a href="api/aio.html#a012">1</a><br/> +TLS, <a href="api/stream.html#a067">1</a><br/> UDP, <a href="tran/udp.html#a002">1</a><br/> <em>udp</em> transport, <a href="tran/udp.html#a001">1</a><br/> <code>udp://</code>, <a href="tran/udp.html#a005">1</a><br/> Universal Resource Locator, <a href="api/url.html#a001">1</a><br/> UNIX domain sockets, <a href="tran/ipc.html#a003">1</a><br/> <code>unix://</code>, <a href="tran/ipc.html#a006">1</a><br/> -URL, <a href="api/url.html#a002">1</a><br/> +URL, <a href="api/url.html#a002">1</a>, <a href="api/stream.html#a025">2</a><br/> version number, <a href="api/misc.html#a005">1</a><br/> voting, <a href="proto/surveyor.html#a004">1</a><br/></p> |
