nanomsg next generation NNG  
Home GitHub Documentation

NOTE: This documentation is for version 0.2.0 of nng, but the latest released version is 1.1.0. Please see the documentation for 1.1.0 for the most up-to-date information.


#include <nng/transport/tcp/tcp.h>

int nng_tcp_register(void);


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.


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:// 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.

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.[1]

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://

  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:

#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.[2]


1. This is a bug and will likely be fixed in the future.
2. Options for TCP keepalive, linger, and nodelay are planned.
NNG Reference Manual v0.2.0 © 2018 Staysail Systems, Inc, © 2018 Capitar IT Group BV
This document is supplied under the MIT License.
nanomsg™ and nng™ are trademarks of Garrett D'Amore.