diff options
| author | Garrett D'Amore <garrett@damore.org> | 2024-03-30 23:07:20 -0700 |
|---|---|---|
| committer | Garrett D'Amore <garrett@damore.org> | 2024-03-30 23:07:20 -0700 |
| commit | f73cd76f54b8aead38689e0ea805d5d805dfbe96 (patch) | |
| tree | 0f6643e955770a9e96a8bbd900ca957a73fe1182 /docs/reference/src/tran/ipc.md | |
| parent | 6f8944a96a5acd509014caae4e57dafbba51e126 (diff) | |
| download | nng-f73cd76f54b8aead38689e0ea805d5d805dfbe96.tar.gz nng-f73cd76f54b8aead38689e0ea805d5d805dfbe96.tar.bz2 nng-f73cd76f54b8aead38689e0ea805d5d805dfbe96.zip | |
Staging work. converted nng_ipc.
Diffstat (limited to 'docs/reference/src/tran/ipc.md')
| -rw-r--r-- | docs/reference/src/tran/ipc.md | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/docs/reference/src/tran/ipc.md b/docs/reference/src/tran/ipc.md new file mode 100644 index 00000000..b2daa40e --- /dev/null +++ b/docs/reference/src/tran/ipc.md @@ -0,0 +1,95 @@ +# IPC Transport + +## DESCRIPTION + +The {{i:*ipc* transport}}{{hi:*ipc*}} provides communication support between +sockets within different processes on the same host. +For POSIX platforms, this is implemented using {{i:UNIX domain sockets}}. +For Windows, this is implemented using Windows {{i:named pipes}}. +Other platforms may have different implementation strategies. + +### URI Formats + +#### Traditional Names + +This transport uses URIs using the scheme {{i:`ipc://`}}, followed by a path +name in the file system where the socket or named pipe should be created. + +> [!TIP] +> On Windows, all names are prefixed by `\\.\pipe\` and do not +> reside in the normal file system. +> On POSIX platforms, the path is taken literally, and is relative to +> the current directory, unless it begins with `/`, in which case it is +> relative to the root directory. + +> [!NOTE] +> When using relative paths on POSIX systems, the address used and returned +> in properties like `NNG_OPT_LOCADDR` and `NNG_OPT_URL` will also be relative. +> Consequently, they will only be interpreted the same by processes that have +> the same working directory. +> To ensure maximum portability and safety, absolute paths are recommended +> whenever possible. + +> [!NOTE] +> If compatibility with legacy _nanomsg_ applications is required, +> then path names must not be longer than 122 bytes, including the final +> `NUL` byte. +> This is because legacy versions of _nanomsg_ cannot express URLs +> longer than 128 bytes, including the `ipc://` prefix. + +#### UNIX Aliases + +The {{i:`unix://`}} scheme is an alias for `ipc://` and can be used inter-changeably, but only on POSIX systems.[^1] + +[^1]: + The purpose of this scheme is to support a future transport making use of {{i:`AF_UNIX`}} + on Windows systems, at which time it will be necessary to discriminate between + the Named Pipes and the `AF_UNIX` based transports. + +#### Abstract Names + +On Linux, this transport also can support {{i:abstract sockets}}. +Abstract sockets use a URI-encoded name after the {{i:`abstract://`}} scheme, which allows arbitrary values to be conveyed +in the path, including embedded `NUL` bytes. +For example, the name `"a\0b"` would be represented as `abstract://a%00b`. + +> [!TIP] +> An empty name may be used with a listener to request "auto bind" be used to select a name. +> In this case the system will allocate a free name. +> The name assigned may be retrieved using [{{i:`NNG_OPT_LOCADDR`}}][NNG_OPT_LOCADDR]. + +Abstract names do not include the leading `NUL` byte used in the low-level socket address. + +Abstract sockets do not have any representation in the file system, and are automatically freed by +the system when no longer in use. + +Abstract sockets ignore socket permissions, but it is still possible to determine the credentials +of the peer with [{{i:`NNG_OPT_PEER_UID`}}][NNG_OPT_PEER_UID], and similar options.[^2] + +[^2]: + This property makes it important that names be chosen randomly to + prevent unauthorized access, or that checks against the peer credentials + are made, or ideally, both. + +### Socket Address + +When using an [`nng_sockaddr`][sockaddr] structure, +the actual structure is of type [`nng_sockaddr_ipc`][sockaddr_ipc], +except for abstract sockets, which use [`nng_sockaddr_abstract`][sockaddr_abstract]. + +### Transport Options + +The following transport options are supported by this transport, +where supported by the underlying platform. + +- [`NNG_OPT_IPC_PERMISSIONS`][NNG_OPT_IPC_PERMISSIONS] +- [`NNG_OPT_IPC_SECURITY_DESCRIPTOR`][NNG_OPT_IPC_SECURITY_DESCRIPTOR] +- [`NNG_OPT_LOCADDR`][NNG_OPT_LOCADDR] +- [`NNG_OPT_REMADDR`][NNG_OPT_REMADDR] +- [`NNG_OPT_PEER_GID`][NNG_OPT_PEER_GID] +- [`NNG_OPT_PEER_PID`][NNG_OPT_PEER_PID] +- [`NNG_OPT_PEER_UID`][NNG_OPT_PEER_UID] +- [`NNG_OPT_PEER_ZONEID`][NNG_OPT_PEER_ZONEID] +- [`NNG_OPT_URL`][NNG_OPT_URL] + +{{#include ../refs.md}} |
