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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
|
= nng_tcp(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_tcp - TCP/IP transport for nng
== SYNOPSIS
[source,c]
----------
#include <nng/transport/tcp/tcp.h>
int nng_tcp_register(void);
----------
== DESCRIPTION
The _nng_tcp_ transport provides communication support between
_nng_ sockets across a TCP/IP network. Both IPv4 and IPv6
are supported when the underlying platform also supports it.
// We need to insert a reference to the nanomsg RFC.
=== Registration
The _tcp_ transport is generally built-in to the _nng_ core, so
no extra steps to use it should be necessary.
=== URI Format
This transport uses URIs using the scheme `tcp://`, followed by
an IP address or hostname, followed by a colon and finally a
TCP port number. For example, to contact port 80 on the localhost
either of the following URIs could be used: `tcp://127.0.0.1:80` or
`tcp://localhost:80`.
When specifying IPv6 addresses, the address must be enclosed in
square brackets (`[]`) to avoid confusion with the final colon
separating the port.
For example, the same port 80 on the IPv6 loopback address ('::1') would
be specified as `tcp://[::1]:80`.
NOTE: When using symbolic names, the name is resolved when the
name is first used. _nng_ won't become aware of changes in the
name resolution until restart,
usually.footnote:[This is a bug and will likely be fixed in the future.]
The special value of 0 (`INADDR_ANY`) can be used for a listener
to indicate that it should listen on all interfaces on the host.
A short-hand for this form is to either omit the address, or specify
the asterisk (`*`) character. For example, the following three
URIs are all equivalent, and could be used to listen to port 9999
on the host:
1. `tcp://0.0.0.0:9999`
2. `tcp://*:9999`
3. `tcp://:9999`
The entire URI must be less than `NNG_MAXADDRLEN` bytes long.
=== Socket Address
When using an `nng_sockaddr` structure, the actual structure is either
of type `nng_sockaddr_in` (for IPv4) or `nng_sockaddr_in6` (for IPv6).
These are `struct` types with the following definitions:
[source,c]
--------
#define NNG_AF_INET 3 <1>
#define NNG_AF_INET6 4
#define NNG_MAXADDRLEN 128
typedef struct {
// ... <2>
uint16_t sa_family; // must be NNG_AF_INET
uint16_t sa_port; // TCP port number
uint32_t sa_addr;
// ...
} nng_sockaddr_in;
typedef struct {
// ... <2>
uint16_t sa_family; // must be NNG_AF_INET6
uint16_t sa_port; // TCP port number
uint8_t sa_addr[16];
// ...
} nng_sockaddr_in6;
--------
<1> The values of these macros may change, so applications
should avoid depending upon their values and instead use them symbolically.
<2> Other members may be present, but only those listed here
are suitable for application use.
The `sa_family` member will have the value `NNG_AF_INET` or `NNG_AF_INET6`.
The `sa_port` and `sa_addr` are the TCP port number and address, both in
network byte order (most significant byte is first).
=== Transport Options
The _tcp_ transport has no special
options.footnote:[Options for TCP keepalive, linger, and nodelay are planned.]
== SEE ALSO
<<nng#,nng(7)>>
|