# Networking

## Summary

| ### Enumerations ||
|---|---|
| `https://developer.android.com/ndk/reference/group/networking#group___networking_1ga9fda9f50d387ff6b0c40c43e75698a35{ https://developer.android.com/ndk/reference/group/networking#group___networking_1gga9fda9f50d387ff6b0c40c43e75698a35ab5173c527fa843cfe3450af078bc3f5d, https://developer.android.com/ndk/reference/group/networking#group___networking_1gga9fda9f50d387ff6b0c40c43e75698a35a722446901e689b98cb92c0bbc0a3ce68 }` | enumPossible values of the blocked reason returned by android_getnetworkblockedreason. |
| `https://developer.android.com/ndk/reference/group/networking#group___networking_1gad2bc71e4f55b658aab7589abb566cdf9{ https://developer.android.com/ndk/reference/group/networking#group___networking_1ggad2bc71e4f55b658aab7589abb566cdf9a898ad1adce7ee88ceeb0146e9c802abe = 1 << 0, https://developer.android.com/ndk/reference/group/networking#group___networking_1ggad2bc71e4f55b658aab7589abb566cdf9a197b09e89de89741d5c17cb9bfa08e68 = 1 << 1, https://developer.android.com/ndk/reference/group/networking#group___networking_1ggad2bc71e4f55b658aab7589abb566cdf9a888f94018ed2af59693d28c5129997ad = 1 << 2 }` | enumPossible values of the flags argument to android_res_nsend and android_res_nquery. |

| ### Typedefs ||
|---|---|
| `https://developer.android.com/ndk/reference/group/networking#group___networking_1ga00cc6790d380b4f9df50c72b16cfdf57` | typedef `uint64_t` The corresponding C type for android.net.Network::getNetworkHandle() return values. |

| ### Functions ||
|---|---|
| `https://developer.android.com/ndk/reference/group/networking#group___networking_1ga0ae9e15612e6411855e295476a98ceee(https://developer.android.com/ndk/reference/group/networking#group___networking_1ga00cc6790d380b4f9df50c72b16cfdf57 network, const char *node, const char *service, const struct addrinfo *hints, struct addrinfo **res)` | `int` Perform hostname resolution via the DNS servers associated with \|network\|. |
| `https://developer.android.com/ndk/reference/group/networking#group___networking_1gabc8b8383cd452032817d5f9ff0054104(int sockfd)` | `int32_t` Returns the recorded blocked reason for the socket and clears it. |
| `https://developer.android.com/ndk/reference/group/networking#group___networking_1ga99e4bfffee26e407b851034d45b6cb71(https://developer.android.com/ndk/reference/group/networking#group___networking_1ga00cc6790d380b4f9df50c72b16cfdf57 *network)` | `int` Gets the \|network\| to which domain name resolutions are bound on the current process. |
| `https://developer.android.com/ndk/reference/group/networking#group___networking_1ga9ee89b64170ded4ba8e749dfe1ca860d(https://developer.android.com/ndk/reference/group/networking#group___networking_1ga00cc6790d380b4f9df50c72b16cfdf57 *network)` | `int` Gets the \|network\| bound to the current process, as per android_setprocnetwork. |
| `https://developer.android.com/ndk/reference/group/networking#group___networking_1ga069351444d0479b9ea530bd01ee2f18c(int nsend_fd)` | `void` Attempts to cancel the in-progress query associated with the \|nsend_fd\| descriptor. |
| `https://developer.android.com/ndk/reference/group/networking#group___networking_1ga5f0622246a0e87b28d7ee8a004eab7c8(https://developer.android.com/ndk/reference/group/networking#group___networking_1ga00cc6790d380b4f9df50c72b16cfdf57 network, const char *dname, int ns_class, int ns_type, uint32_t flags)` | `int` Look up the {\|ns_class\|, \|ns_type\|} Resource Record (RR) associated with Domain Name \|dname\| on the given \|network\|. |
| `https://developer.android.com/ndk/reference/group/networking#group___networking_1gaec075420241c2ecb3b86e78b32806128(int fd, int *rcode, uint8_t *answer, size_t anslen)` | `int` Read a result for the query associated with the \|fd\| descriptor. |
| `https://developer.android.com/ndk/reference/group/networking#group___networking_1gaa7652fdc7b687522481a00c9f0d5008e(https://developer.android.com/ndk/reference/group/networking#group___networking_1ga00cc6790d380b4f9df50c72b16cfdf57 network, const uint8_t *msg, size_t msglen, uint32_t flags)` | `int` Issue the query \|msg\| on the given \|network\|. |
| `https://developer.android.com/ndk/reference/group/networking#group___networking_1ga354a0f42c12a05f2ef4316a1ee3f6f3e(https://developer.android.com/ndk/reference/group/networking#group___networking_1ga00cc6790d380b4f9df50c72b16cfdf57 network)` | `int` Binds domain name resolutions performed by this process to \|network\|. |
| `https://developer.android.com/ndk/reference/group/networking#group___networking_1ga5681d790b3db186dbf5e0e0e3b120318(https://developer.android.com/ndk/reference/group/networking#group___networking_1ga00cc6790d380b4f9df50c72b16cfdf57 network)` | `int` Binds the current process to \|network\|. |
| `https://developer.android.com/ndk/reference/group/networking#group___networking_1ga8e95aa1b80cd9fbe74c6e30dfe366e73(https://developer.android.com/ndk/reference/group/networking#group___networking_1ga00cc6790d380b4f9df50c72b16cfdf57 network, int fd)` | `int` All functions below that return an int return 0 on success or -1 on failure with an appropriate errno value set. |
| `https://developer.android.com/ndk/reference/group/networking#group___networking_1gaffecb67375dcfe792222d91ea1be5ea8(int sockfd, uint32_t tag)` | `int` |
| `https://developer.android.com/ndk/reference/group/networking#group___networking_1gae9f8bf4a692852332fca98454c6d3c62(int sockfd, uint32_t tag, uid_t uid)` | `int` |
| `https://developer.android.com/ndk/reference/group/networking#group___networking_1gac62b6938a194342438f5d37835afebc4(int sockfd)` | `int` |

## Enumerations

### NetworkBlockedReason

Declared in `android/multinetwork.h`

```
 NetworkBlockedReason
```
Possible values of the blocked reason returned by android_getnetworkblockedreason.

| Properties ||
|---|---|
| `ANDROID_NETWORK_BLOCKED_REASON_LNP` | The packet was blocked by Local Network Protection (LNP). |
| `ANDROID_NETWORK_BLOCKED_REASON_NONE` | The packet was not blocked, or no blocked reason is available. |

### ResNsendFlags

Declared in `android/multinetwork.h`

```
 ResNsendFlags
```
Possible values of the flags argument to android_res_nsend and android_res_nquery.

Values are ORed together.

| Properties ||
|---|---|
| `ANDROID_RESOLV_NO_CACHE_LOOKUP` | Don't lookup the request in cache. |
| `ANDROID_RESOLV_NO_CACHE_STORE` | Don't lookup this request in the cache, and don't cache the result of the lookup. This flag implies [ANDROID_RESOLV_NO_CACHE_LOOKUP](https://developer.android.com/ndk/reference/group/networking#group___networking_1ggad2bc71e4f55b658aab7589abb566cdf9a888f94018ed2af59693d28c5129997ad). |
| `ANDROID_RESOLV_NO_RETRY` | Send a single request to a single resolver and fail on timeout or network errors. |

## Typedefs

### net_handle_t

Declared in `android/multinetwork.h`

```
uint64_t net_handle_t
```
The corresponding C type for android.net.Network::getNetworkHandle() return values.

The Java signed long value can be safely cast to a net_handle_t:

\[C\] ((net_handle_t) java_long_network_handle) \[C++\] static_cast(java_long_network_handle)

as appropriate.

## Functions

### android_getaddrinfofornetwork

Declared in `android/multinetwork.h`

```
int android_getaddrinfofornetwork(
  net_handle_t network,
  const char *node,
  const char *service,
  const struct addrinfo *hints,
  struct addrinfo **res
)
```
Perform hostname resolution via the DNS servers associated with \|network\|.

All arguments (apart from \|network\|) are used identically as those passed to getaddrinfo(3). Return and error values are identical to those of getaddrinfo(3), and in particular gai_strerror(3) can be used as expected. Similar to getaddrinfo(3):

- \|hints\| may be NULL (in which case man page documented defaults apply)
- either \|node\| or \|service\| may be NULL, but not both
- \|res\| must not be NULL

<br />

This is the equivalent of: [android.net.Network::getAllByName()](https://developer.android.com/reference/android/net/Network.html#getAllByName(java.lang.String))

Available since API level 23.

### android_getnetworkblockedreason

Declared in `android/multinetwork.h`

```
int32_t android_getnetworkblockedreason(
  int sockfd
)
```
Returns the recorded blocked reason for the socket and clears it.

<br />

Details Parameters `sockfd` Socket file descriptor. **Returns** A value from [NetworkBlockedReason](https://developer.android.com/ndk/reference/group/networking#group___networking_1ga9fda9f50d387ff6b0c40c43e75698a35) on success, or a negative POSIX error code if an error occurs.

### android_getprocdns

Declared in `android/multinetwork.h`

```
int android_getprocdns(
  net_handle_t *network
)
```
Gets the \|network\| to which domain name resolutions are bound on the current process.

Returns 0 on success, or -1 setting errno to EINVAL if a null pointer is passed in.

Available since API level 31.

### android_getprocnetwork

Declared in `android/multinetwork.h`

```
int android_getprocnetwork(
  net_handle_t *network
)
```
Gets the \|network\| bound to the current process, as per android_setprocnetwork.

This is the equivalent of: [android.net.ConnectivityManager::getBoundNetworkForProcess()](https://developer.android.com/reference/android/net/ConnectivityManager.html#getBoundNetworkForProcess(android.net.Network)) Returns 0 on success, or -1 setting errno to EINVAL if a null pointer is passed in.

Available since API level 31.

### android_res_cancel

Declared in `android/multinetwork.h`

```
void android_res_cancel(
  int nsend_fd
)
```
Attempts to cancel the in-progress query associated with the \|nsend_fd\| descriptor.

Available since API level 29.

### android_res_nquery

Declared in `android/multinetwork.h`

```
int android_res_nquery(
  net_handle_t network,
  const char *dname,
  int ns_class,
  int ns_type,
  uint32_t flags
)
```
Look up the {\|ns_class\|, \|ns_type\|} Resource Record (RR) associated with Domain Name \|dname\| on the given \|network\|.

The typical value for \|ns_class\| is ns_c_in, while \|type\| can be any record type (for instance, ns_t_aaaa or ns_t_txt). \|flags\| is a additional config to control actual querying behavior, see ResNsendFlags for detail.

Returns a file descriptor to watch for read events, or a negative POSIX error code (see errno.h) if an immediate error occurs.

Available since API level 29.

### android_res_nresult

Declared in `android/multinetwork.h`

```
int android_res_nresult(
  int fd,
  int *rcode,
  uint8_t *answer,
  size_t anslen
)
```
Read a result for the query associated with the \|fd\| descriptor.

Closes \|fd\| before returning.

Available since 29.

Returns: \< 0: negative POSIX error code (see errno.h for possible values). \|rcode\| is not set. \>= 0: length of \|answer\|. \|rcode\| is the resolver return code (e.g., ns_r_nxdomain)

### android_res_nsend

Declared in `android/multinetwork.h`

```
int android_res_nsend(
  net_handle_t network,
  const uint8_t *msg,
  size_t msglen,
  uint32_t flags
)
```
Issue the query \|msg\| on the given \|network\|.

\|flags\| is a additional config to control actual querying behavior, see ResNsendFlags for detail.

Returns a file descriptor to watch for read events, or a negative POSIX error code (see errno.h) if an immediate error occurs.

Available since API level 29.

### android_setprocdns

Declared in `android/multinetwork.h`

```
int android_setprocdns(
  net_handle_t network
)
```
Binds domain name resolutions performed by this process to \|network\|.

android_setprocnetwork takes precedence over this setting.

To clear a previous process binding, invoke with NETWORK_UNSPECIFIED. On success 0 is returned. On error -1 is returned, and errno is set.

Available since API level 31.

### android_setprocnetwork

Declared in `android/multinetwork.h`

```
int android_setprocnetwork(
  net_handle_t network
)
```
Binds the current process to \|network\|.

All sockets created in the future (and not explicitly bound via [android_setsocknetwork()](https://developer.android.com/ndk/reference/group/networking#group___networking_1ga8e95aa1b80cd9fbe74c6e30dfe366e73)) will be bound to \|network\|. All host name resolutions will be limited to \|network\| as well. Note that if the network identified by \|network\| ever disconnects, all sockets created in this way will cease to work and all host name resolutions will fail. This is by design so an application doesn't accidentally use sockets it thinks are still bound to a particular network.

To clear a previous process binding, invoke with NETWORK_UNSPECIFIED.

This is the equivalent of: [android.net.ConnectivityManager::bindProcessToNetwork()](https://developer.android.com/reference/android/net/ConnectivityManager.html#bindProcessToNetwork(android.net.Network))

Available since API level 23.

### android_setsocknetwork

Declared in `android/multinetwork.h`

```
int android_setsocknetwork(
  net_handle_t network,
  int fd
)
```
All functions below that return an int return 0 on success or -1 on failure with an appropriate errno value set.

Set the network to be used by the given socket file descriptor.

To clear a previous socket binding, invoke with NETWORK_UNSPECIFIED.

This is the equivalent of: [android.net.Network::bindSocket()](https://developer.android.com/reference/android/net/Network.html#bindSocket(java.net.Socket))

Available since API level 23.

### android_tag_socket

Declared in `android/multinetwork.h`

```
int android_tag_socket(
  int sockfd,
  uint32_t tag
)
```

### android_tag_socket_with_uid

Declared in `android/multinetwork.h`

```
int android_tag_socket_with_uid(
  int sockfd,
  uint32_t tag,
  uid_t uid
)
```

### android_untag_socket

Declared in `android/multinetwork.h`

```
int android_untag_socket(
  int sockfd
)
```