---
layout: doc
title: "Starboard Module Reference: socket.h"
---

Defines Starboard socket I/O functions. Starboard supports IPv4 and IPv6, TCP
and UDP, server and client sockets. Some platforms may not support IPv6, some
may not support listening sockets, and some may not support any kind of sockets
at all (or only allow them in debug builds).

Starboard ONLY supports non-blocking socket I/O, so all sockets are non-blocking
at creation time.

Note that, on some platforms, API calls on one end of a socket connection may
not be instantaneously aware of manipulations on the socket at the other end of
the connection, thus requiring use of either an SbSocketWaiter or spin-polling.

TODO: For platforms that do not support sockets at all, they must support at
least a high-level HTTP client API (to be defined later).

## Macros ##

### kSbSocketInvalid ###

Well-defined value for an invalid socket handle.

## Enums ##

### SbSocketAddressType ###

All possible address types.

#### Values ####

*   `kSbSocketAddressTypeIpv4`

    An IPv4 address, using only the first 4 entries of the address buffer.
*   `kSbSocketAddressTypeIpv6`

    An IPv6 address, which uses 16 entries of the address buffer.

### SbSocketError ###

Enumeration of all Starboard socket operation results. Despite the enum name,
note that the value actually describes the outcome of an operation, which is not
always an error.

#### Values ####

*   `kSbSocketOk`

    The operation succeeded.
*   `kSbSocketPending`

    The operation is blocked on I/O. Either try again "later," or be very clever
    and wait on it with a SbSocketWaiter.
*   `kSbSocketErrorConnectionReset`

    This socket error is generated when the connection is reset unexpectedly and
    the connection is now invalid. This might happen for example if an read
    packet has the "TCP RST" bit set.
*   `kSbSocketErrorFailed`

    The operation failed for some other reason not specified above.

### SbSocketProtocol ###

All possible IP socket types.

#### Values ####

*   `kSbSocketProtocolTcp`

    The TCP/IP protocol, a reliable, stateful, streaming protocol.
*   `kSbSocketProtocolUdp`

    The UDP/IP protocol, an unreliable, connectionless, discrete packet
    (datagram) protocol.

### SbSocketResolveFilter ###

Bits that can be set when calling SbSocketResolve to filter the results.

#### Values ####

*   `kSbSocketResolveFilterNone`

    No filters, include everything.
*   `kSbSocketResolveFilterIpv4`

    Include Ipv4 addresses.
*   `kSbSocketResolveFilterIpv6`

    Include Ipv6 addresses.

## Typedefs ##

### SbSocket ###

A handle to a socket.

#### Definition ####

```
typedef SbSocketPrivate* SbSocket
```

## Structs ##

### SbSocketAddress ###

A representation of any possible supported address type.

#### Members ####

*   `uint8_t address`

    The storage for the address. For IPv4, only the first 4 bytes make up the
    address. For IPv6, the entire buffer of 16 bytes is meaningful. An address
    of all zeros means that the address is unspecified.
*   `SbSocketAddressType type`

    The type of address this represents (IPv4 vs IPv6).
*   `int port`

    The port component of this socket address. If not specified, it will be
    zero, which is officially undefined.

### SbSocketResolution ###

The result of a host name resolution.

#### Members ####

*   `SbSocketAddress* addresses`

    An array of addresses associated with the host name.
*   `int address_count`

    The length of the `addresses` array.

## Functions ##

### SbSocketAccept ###

Accepts a pending connection on `socket` and returns a new SbSocket representing
that connection. This function sets the error on `socket` and returns
`kSbSocketInvalid` if it is unable to accept a new connection.

`socket`: The SbSocket that is accepting a pending connection.

#### Declaration ####

```
SbSocket SbSocketAccept(SbSocket socket)
```

### SbSocketBind ###

Binds `socket` to a specific local interface and port specified by
`local_address`. This function sets and returns the socket error if it is unable
to bind to `local_address`.

`socket`: The SbSocket to be bound to the local interface. `local_address`: The
local address to which the socket is to be bound. This value must not be `NULL`.

*   Setting the local address to port `0` (or not specifying a port) indicates
    that the function should choose a port for you.

*   Setting the IP address to `0.0.0.0` means that the socket should be bound to
    all interfaces.

#### Declaration ####

```
SbSocketError SbSocketBind(SbSocket socket, const SbSocketAddress *local_address)
```

### SbSocketClearLastError ###

Clears the last error set on `socket`. The return value indicates whether the
socket error was cleared.

#### Declaration ####

```
bool SbSocketClearLastError(SbSocket socket)
```

### SbSocketConnect ###

Opens a connection of `socket`'s type to the host and port specified by
`address`. This function sets and returns the socket error if it is unable to
connect to `address`. (It returns `kSbSocketOk` if it creates the connection
successfully.)

`socket`: The type of connection that should be opened. `address`: The host and
port to which the socket should connect.

#### Declaration ####

```
SbSocketError SbSocketConnect(SbSocket socket, const SbSocketAddress *address)
```

### SbSocketCreate ###

Creates a new non-blocking socket for protocol `protocol` using address family
`address_type`.

*   If successful, this function returns the newly created handle.

*   If unsuccessful, this function returns `kSbSocketInvalid` and also sets the
    last system error appropriately.

`address_type`: The type of IP address to use for the socket. `protocol`: The
protocol to use for the socket.

#### Declaration ####

```
SbSocket SbSocketCreate(SbSocketAddressType address_type, SbSocketProtocol protocol)
```

### SbSocketDestroy ###

Destroys the `socket` by flushing it, closing any connection that may be active
on it, and reclaiming any resources associated with it, including any
registration with an `SbSocketWaiter`.

The return value indicates whether the destruction was successful. However, even
if this function returns `false`, you should not be able to use the socket any
more.

`socket`: The SbSocket to be destroyed.

#### Declaration ####

```
bool SbSocketDestroy(SbSocket socket)
```

### SbSocketFreeResolution ###

Frees a resolution allocated by SbSocketResolve.

`resolution`: The resolution to be freed.

#### Declaration ####

```
void SbSocketFreeResolution(SbSocketResolution *resolution)
```

### SbSocketGetInterfaceAddress ###

Gets the source address and the netmask that would be used to connect to the
destination. The netmask parameter is optional, and only populated if a non-NULL
parameter is passed in. To determine which source IP will be used, the kernel
takes into account the protocol, routes, destination ip, etc. The subnet mask,
aka netmask, is used to find the routing prefix. In IPv6, this should be derived
from the prefix value.

Returns whether it was possible to determine the source address and the netmask
(if non-NULL value is passed) to be used to connect to the destination. This
function could fail if the destination is not reachable, if it an invalid
address, etc.

`destination`: The destination IP to be connected to. If IP addresses is not
0.0.0.0 or ::, then temporary addresses may be returned.

If the destination address is 0.0.0.0, and its `type` is
`kSbSocketAddressTypeIpv4`, then any IPv4 local interface that is up and not a
loopback interface is a valid return value.

If the destination address is ::, and its `type` is `kSbSocketAddressTypeIpv6`
then any IPv6 local interface that is up and not loopback or a link-local IP is
a valid return value. However, in the case of IPv6, the address with the biggest
scope must be returned. E.g., a globally scoped and routable IP is prefered over
a unique local address (ULA). Also, the IP address that is returned must be
permanent.

If destination address is NULL, then any IP address that is valid for
`destination` set to 0.0.0.0 (IPv4) or :: (IPv6) can be returned.

`out_source_address`: This function places the address of the local interface in
this output variable. `out_netmask`: This parameter is optional. If a non-NULL
value is passed in, this function places the netmask associated with the source
address in this output variable.

#### Declaration ####

```
bool SbSocketGetInterfaceAddress(const SbSocketAddress *const destination, SbSocketAddress *out_source_address, SbSocketAddress *out_netmask)
```

### SbSocketGetLastError ###

Returns the last error set on `socket`. If `socket` is not valid, this function
returns `kSbSocketErrorFailed`.

`socket`: The SbSocket that the last error is returned for.

#### Declaration ####

```
SbSocketError SbSocketGetLastError(SbSocket socket)
```

### SbSocketGetLocalAddress ###

Gets the address that this socket is bound to locally, if the socket is
connected. The return value indicates whether the address was retrieved
successfully.

`socket`: The SbSocket for which the local address is retrieved. `out_address`:
The SbSocket's local address.

#### Declaration ####

```
bool SbSocketGetLocalAddress(SbSocket socket, SbSocketAddress *out_address)
```

### SbSocketIsConnected ###

Indicates whether `socket` is connected to anything. Invalid sockets are not
connected.

`socket`: The SbSocket to be checked.

#### Declaration ####

```
bool SbSocketIsConnected(SbSocket socket)
```

### SbSocketIsConnectedAndIdle ###

Returns whether `socket` is connected to anything, and, if so, whether it is
receiving any data.

`socket`: The SbSocket to be checked.

#### Declaration ####

```
bool SbSocketIsConnectedAndIdle(SbSocket socket)
```

### SbSocketIsValid ###

Returns whether the given socket handle is valid.

#### Declaration ####

```
static bool SbSocketIsValid(SbSocket socket)
```

### SbSocketJoinMulticastGroup ###

Joins `socket` to an IP multicast group identified by `address`. The equivalent
of IP_ADD_MEMBERSHIP. The return value indicates whether the socket was joined
to the group successfully.

`socket`: The SbSocket to be joined to the IP multicast group. `address`: The
location of the IP multicast group.

#### Declaration ####

```
bool SbSocketJoinMulticastGroup(SbSocket socket, const SbSocketAddress *address)
```

### SbSocketListen ###

Causes `socket` to listen on the local address that `socket` was previously
bound to by SbSocketBind. This function sets and returns the socket error if it
is unable to listen for some reason. (It returns `kSbSocketOk` if it creates the
connection successfully.)

`socket`: The SbSocket on which the function operates.

#### Declaration ####

```
SbSocketError SbSocketListen(SbSocket socket)
```

### SbSocketReceiveFrom ###

Reads up to `data_size` bytes from `socket` into `out_data` and places the
source address of the packet in `out_source` if out_source is not NULL. Returns
the number of bytes read, or a negative number if there is an error, in which
case SbSocketGetLastError can provide the precise error encountered.

Note that this function is NOT specified to make a best effort to read all data
on all platforms, but it MAY still do so. It is specified to read however many
bytes are available conveniently, meaning that it should avoid blocking until
there is data. It can be run in a loop until SbSocketGetLastError returns
`kSbSocketPending` to make it a best-effort read (but still only up to not
blocking, unless you want to spin).

The primary use of `out_source` is to receive datagram packets from multiple
sources on a UDP server socket. TCP has two endpoints connected persistently, so
the address is unnecessary, but allowed.

`socket`: The SbSocket from which data is read. `out_data`: The data read from
the socket. `data_size`: The number of bytes to read. `out_source`: The source
address of the packet.

#### Declaration ####

```
int SbSocketReceiveFrom(SbSocket socket, char *out_data, int data_size, SbSocketAddress *out_source)
```

### SbSocketResolve ###

Synchronously resolves `hostname` into the returned SbSocketResolution , which
must be freed with SbSocketFreeResolution. The function returns `NULL` if it is
unable to resolve `hostname`.

`hostname`: The hostname to be resolved. `filters`: A mask of
SbSocketResolveFilter values used to filter the resolution. If `filters` does
not specify an IP address family filter, all address families are included.
However, if one IP address family filter is specified, only that address family
is included. The function ignores unrecognized filter bits.

#### Declaration ####

```
SbSocketResolution* SbSocketResolve(const char *hostname, int filters)
```

### SbSocketSendTo ###

Writes up to `data_size` bytes of `data` to `destination` via `socket`. Returns
the number of bytes written, or a negative number if there is an error, in which
case `SbSocketGetLastError` can provide the precise error encountered.

Note that this function is NOT specified to make a best effort to write all data
on all platforms, but it MAY still do so. It is specified to write however many
bytes are available conveniently. It can be run in a loop until
SbSocketGetLastError returns `kSbSocketPending` to make it a best-effort write
(but still only up to not blocking, unless you want to spin).

`socket`: The SbSocket to use to write data. `data`: The data read from the
socket. `data_size`: The number of bytes of `data` to write. `destination`: The
location to which data is written. This value must be `NULL` for TCP
connections, which can only have a single endpoint.

The primary use of `destination` is to send datagram packets, which can go out
to multiple sources from a single UDP server socket. TCP has two endpoints
connected persistently, so setting `destination` when sending to a TCP socket
will cause an error.

#### Declaration ####

```
int SbSocketSendTo(SbSocket socket, const char *data, int data_size, const SbSocketAddress *destination)
```

### SbSocketSetBroadcast ###

Sets the `SO_BROADCAST`, or equivalent, option to `value` on `socket`. The
return value indicates whether the option was actually set.

This option is only meaningful for UDP sockets and allows the socket to send to
the broadcast address.

`socket`: The SbSocket for which the option is set. `value`: The new value for
the option.

#### Declaration ####

```
bool SbSocketSetBroadcast(SbSocket socket, bool value)
```

### SbSocketSetReceiveBufferSize ###

Sets the `SO_RCVBUF`, or equivalent, option to `size` on `socket`. The return
value indicates whether the option was actually set.

`socket`: The SbSocket for which the option is set. `size`: The value for the
option.

#### Declaration ####

```
bool SbSocketSetReceiveBufferSize(SbSocket socket, int32_t size)
```

### SbSocketSetReuseAddress ###

Sets the `SO_REUSEADDR`, or equivalent, option to `value` on `socket`. The
return value indicates whether the option was actually set.

This option allows a bound address to be reused if a socket isn't actively bound
to it.

`socket`: The SbSocket for which the option is set. `value`: The new value for
the option.

#### Declaration ####

```
bool SbSocketSetReuseAddress(SbSocket socket, bool value)
```

### SbSocketSetSendBufferSize ###

Sets the `SO_SNDBUF`, or equivalent, option to `size` on `socket`. The return
value indicates whether the option was actually set.

`socket`: The SbSocket for which the option is set. `size`: The value for the
option.

#### Declaration ####

```
bool SbSocketSetSendBufferSize(SbSocket socket, int32_t size)
```

### SbSocketSetTcpKeepAlive ###

Sets the `SO_KEEPALIVE`, or equivalent, option to `value` on `socket`. The
return value indicates whether the option was actually set.

`socket`: The SbSocket for which the option is set. `value`: If set to `true`,
then `period` specifies the minimum time (SbTime) is always in microseconds)
between keep-alive packets. If set to `false`, `period` is ignored. `period`:
The time between keep-alive packets. This value is only relevant if `value` is
`true`.

#### Declaration ####

```
bool SbSocketSetTcpKeepAlive(SbSocket socket, bool value, SbTime period)
```

### SbSocketSetTcpNoDelay ###

Sets the `TCP_NODELAY`, or equivalent, option to `value` on `socket`. The return
value indicates whether the option was actually set.

This function disables the Nagle algorithm for reducing the number of packets
sent when converting from a stream to packets. Disabling Nagle generally puts
the data for each Send call into its own packet, but does not guarantee that
behavior.

`socket`: The SbSocket for which the option is set. `value`: Indicates whether
the Nagle algorithm should be disabled (`value`=`true`).

#### Declaration ####

```
bool SbSocketSetTcpNoDelay(SbSocket socket, bool value)
```

### SbSocketSetTcpWindowScaling ###

Sets the `SO_WINSCALE`, or equivalent, option to `value` on `socket`. The return
value indicates whether the option was actually set.

`socket`: The SbSocket for which the option is set. `value`: The value for the
option.

#### Declaration ####

```
bool SbSocketSetTcpWindowScaling(SbSocket socket, bool value)
```

