# Mojo C++ Platform API
This document is a subset of the [Mojo documentation](/mojo/README.md).
[TOC]
## Overview
The Mojo C++ Platform API provides a lightweight set of abstractions around
stable platform primitive APIs like UNIX domain sockets and Windows named pipes.
This API is primarily useful in conjunction with Mojo
[Invitations](/mojo/public/cpp/system/README.md#Invitations) to bootstrap Mojo
IPC between two processes.
## Platform Handles
The `PlatformHandle` type provides a move-only wrapper around an owned,
platform-specific primitive handle types. The type of primitive it holds can be
any of the following:
* Windows HANDLE (Windows only)
* Fuchsia zx_handle_t (Fuchsia only)
* Mach send right (OSX only)
* POSIX file descriptor (POSIX systems only)
See the
[header](https://cs.chromium.org/src/mojo/public/cpp/platform/platform_handle.h)
for more details.
## Platform Channels
The `PlatformChannel` type abstracts a platform-specific IPC FIFO primitive
primarily for use with the Mojo
[Invitations](/mojo/public/cpp/system/README.md#Invitations) API. Constructing
a `PlatformChannel` instance creates the underlying system primitive with two
transferrable `PlatformHandle` instances, each thinly wrapped as a
`PlatformChannelEndpoint` for additional type-safety. One endpoint is designated
as **local** and the other **remote**, the intention being that the remote
endpoint will be transferred to another process in the system.
See the
[header](https://cs.chromium.org/src/mojo/public/cpp/platform/platform_channel.h)
for more details. See the
[Invitations](/mojo/public/cpp/system/README.md#Invitations) documentation for
an example of using `PlatformChannel` with an invitation to bootstrap IPC
between a process and one of its newly launched child processes.
## Named Platform Channels
For cases where it is not feasible to transfer a `PlatformHandle` from one
running process to another, the Platform API also provides
`NamedPlatformChannel`, which abstracts a named system resource that can
facilitate communication similarly to `PlatformChannel`.
A `NamedPlatformChannel` upon construction will begin listening on
platform-specific primitive (a named pipe server on Windows, a domain socket
server on POSIX, *etc.*). The globally reachable name of the server (*e.g.* the
socket path) can be specified at construction time via
`NamedPlatformChannel::Options::server_name`, but if no name is given, a
suitably random one is generated and used.
``` cpp
// In one process
mojo::NamedPlatformChannel::Options options;
mojo::NamedPlatformChannel named_channel(options);
OutgoingInvitation::Send(std::move(invitation),
named_channel.TakeServerEndpoint());
SendServerNameToRemoteProcessSomehow(named_channel.GetServerName());
// In the other process
void OnGotServerName(const mojo::NamedPlatformChannel::ServerName& name) {
// Connect to the server.
mojo::PlatformChannelEndpoint endpoint =
mojo::NamedPlatformChannel::ConnectToServer(name);
// Proceed normally with invitation acceptance.
auto invitation = mojo::IncomingInvitation::Accept(std::move(endpoint));
// ...
}
```