Add an API to select a network for a DatagramSocket.
Mirrors the API that does this for Sockets. Bug: 18076907 Change-Id: Ifa27b39e23797558546aab751fbfb3aed3b7dbcb
This commit is contained in:
@@ -21,7 +21,9 @@ import android.os.Parcelable;
|
||||
import android.os.Parcel;
|
||||
import android.system.ErrnoException;
|
||||
|
||||
import java.io.FileDescriptor;
|
||||
import java.io.IOException;
|
||||
import java.net.DatagramSocket;
|
||||
import java.net.InetAddress;
|
||||
import java.net.InetSocketAddress;
|
||||
import java.net.MalformedURLException;
|
||||
@@ -263,19 +265,41 @@ public class Network implements Parcelable {
|
||||
.open(url);
|
||||
}
|
||||
|
||||
/**
|
||||
* Binds the specified {@link DatagramSocket} to this {@code Network}. All data traffic on the
|
||||
* socket will be sent on this {@code Network}, irrespective of any process-wide network binding
|
||||
* set by {@link ConnectivityManager#setProcessDefaultNetwork}. The socket must not be
|
||||
* connected.
|
||||
*/
|
||||
public void bindSocket(DatagramSocket socket) throws IOException {
|
||||
// Apparently, the kernel doesn't update a connected UDP socket's routing upon mark changes.
|
||||
if (socket.isConnected()) {
|
||||
throw new SocketException("Socket is connected");
|
||||
}
|
||||
// Query a property of the underlying socket to ensure that the socket's file descriptor
|
||||
// exists, is available to bind to a network and is not closed.
|
||||
socket.getReuseAddress();
|
||||
bindSocketFd(socket.getFileDescriptor$());
|
||||
}
|
||||
|
||||
/**
|
||||
* Binds the specified {@link Socket} to this {@code Network}. All data traffic on the socket
|
||||
* will be sent on this {@code Network}, irrespective of any process-wide network binding set by
|
||||
* {@link ConnectivityManager#setProcessDefaultNetwork}. The socket must not be connected.
|
||||
*/
|
||||
public void bindSocket(Socket socket) throws IOException {
|
||||
// Apparently, the kernel doesn't update a connected TCP socket's routing upon mark changes.
|
||||
if (socket.isConnected()) {
|
||||
throw new SocketException("Socket is connected");
|
||||
}
|
||||
// Query a property of the underlying socket to ensure the underlying
|
||||
// socket exists so a file descriptor is available to bind to a network.
|
||||
// Query a property of the underlying socket to ensure that the socket's file descriptor
|
||||
// exists, is available to bind to a network and is not closed.
|
||||
socket.getReuseAddress();
|
||||
int err = NetworkUtils.bindSocketToNetwork(socket.getFileDescriptor$().getInt$(), netId);
|
||||
bindSocketFd(socket.getFileDescriptor$());
|
||||
}
|
||||
|
||||
private void bindSocketFd(FileDescriptor fd) throws IOException {
|
||||
int err = NetworkUtils.bindSocketToNetwork(fd.getInt$(), netId);
|
||||
if (err != 0) {
|
||||
// bindSocketToNetwork returns negative errno.
|
||||
throw new ErrnoException("Binding socket to network " + netId, -err)
|
||||
|
||||
Reference in New Issue
Block a user