Socket.java revision 1f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6
1adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/* 2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Licensed to the Apache Software Foundation (ASF) under one or more 3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * contributor license agreements. See the NOTICE file distributed with 4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * this work for additional information regarding copyright ownership. 5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The ASF licenses this file to You under the Apache License, Version 2.0 6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * (the "License"); you may not use this file except in compliance with 7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the License. You may obtain a copy of the License at 8adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 10adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software 12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * See the License for the specific language governing permissions and 15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * limitations under the License. 16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage java.net; 19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.IOException; 21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.InputStream; 22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.OutputStream; 23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.nio.channels.SocketChannel; 24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.AccessController; 251f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti// BEGIN android-added 261f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colittiimport java.util.logging.Logger; 271f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colittiimport java.util.logging.Level; 281f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti// END android-added 29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.apache.harmony.luni.net.NetUtil; 31f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilsonimport org.apache.harmony.luni.net.PlainSocketImpl; 32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.apache.harmony.luni.platform.Platform; 33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.apache.harmony.luni.util.Msg; 34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.apache.harmony.luni.util.PriviAction; 35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/** 37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Provides a client-side TCP socket. 38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic class Socket { 40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project SocketImpl impl; 42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project static SocketImplFactory factory; 44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private volatile boolean isCreated = false; 46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private boolean isBound = false; 48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private boolean isConnected = false; 50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private boolean isClosed = false; 52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private boolean isInputShutdown = false; 54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private boolean isOutputShutdown = false; 56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private static class ConnectLock { 58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private Object connectLock = new ConnectLock(); 61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private Proxy proxy; 63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project static final int MULTICAST_IF = 1; 65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project static final int MULTICAST_TTL = 2; 67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project static final int TCP_NODELAY = 4; 69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project static final int FLAG_SHUTDOWN = 8; 71f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson 721f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti static private Logger logger; 731f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti 741f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti static private Logger getLogger() { 751f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti if (logger == null) { 761f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti logger = Logger.getLogger(Socket.class.getName()); 771f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti } 781f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti return logger; 791f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti } 801f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti 81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project static { 82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Platform.getNetworkSystem().oneTimeInitialization(true); 83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Creates a new unconnected socket. When a SocketImplFactory is defined it 87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * creates the internal socket implementation, otherwise the default socket 88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * implementation will be used for this socket. 89f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see SocketImplFactory 91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see SocketImpl 92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public Socket() { 94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project impl = factory != null ? factory.createSocketImpl() 95f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson : new PlainSocketImpl(); 96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Creates a new unconnected socket using the given proxy type. When a 100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code SocketImplFactory} is defined it creates the internal socket 101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * implementation, otherwise the default socket implementation will be used 102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * for this socket. 103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Example that will create a socket connection through a {@code SOCKS} 105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * proxy server: <br> 106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code Socket sock = new Socket(new Proxy(Proxy.Type.SOCKS, new 107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * InetSocketAddress("test.domain.org", 2130)));} 108f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param proxy 110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the specified proxy for this socket. 111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IllegalArgumentException 112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the argument {@code proxy} is {@code null} or of an 113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * invalid type. 114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws SecurityException 115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if a security manager exists and it denies the permission to 116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * connect to the given proxy. 117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see SocketImplFactory 118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see SocketImpl 119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public Socket(Proxy proxy) { 121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (null == proxy || Proxy.Type.HTTP == proxy.type()) { 122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // KA023=Proxy is null or invalid type 123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new IllegalArgumentException(Msg.getString("KA023")); //$NON-NLS-1$ 124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project InetSocketAddress address = (InetSocketAddress) proxy.address(); 126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (null != address) { 127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project InetAddress addr = address.getAddress(); 128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String host; 129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (null != addr) { 130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project host = addr.getHostAddress(); 131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else { 132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project host = address.getHostName(); 133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int port = address.getPort(); 135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project checkConnectPermission(host, port); 136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project impl = factory != null ? factory.createSocketImpl() 138f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson : new PlainSocketImpl(proxy); 139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.proxy = proxy; 140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1421f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti // BEGIN android-added 1431f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti /** 1441f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti * Tries to connect a socket to all IP addresses of the given hostname. 1451f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti * 1461f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti * @param dstName 1471f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti * the target host name or IP address to connect to. 1481f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti * @param dstPort 1491f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti * the port on the target host to connect to. 1501f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti * @param localAddress 1511f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti * the address on the local host to bind to. 1521f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti * @param localPort 1531f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti * the port on the local host to bind to. 1541f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti * @param streaming 1551f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti * if {@code true} a streaming socket is returned, a datagram 1561f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti * socket otherwise. 1571f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti * @throws UnknownHostException 1581f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti * if the host name could not be resolved into an IP address. 1591f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti * @throws IOException 1601f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti * if an error occurs while creating the socket. 1611f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti * @throws SecurityException 1621f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti * if a security manager exists and it denies the permission to 1631f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti * connect to the given address and port. 1641f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti */ 1651f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti private void tryAllAddresses(String dstName, int dstPort, InetAddress 1661f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti localAddress, int localPort, boolean streaming) throws IOException { 1671f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti InetAddress[] dstAddresses = InetAddress.getAllByName(dstName); 1681f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti // Loop through all the destination addresses except the last, trying to 1691f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti // connect to each one and ignoring errors. There must be at least one 1701f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti // address, or getAllByName would have thrown UnknownHostException. 1711f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti InetAddress dstAddress; 1721f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti for (int i = 0; i < dstAddresses.length - 1; i++) { 1731f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti dstAddress = dstAddresses[i]; 1741f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti try { 1751f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti checkDestination(dstAddress, dstPort); 1761f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti startupSocket(dstAddress, dstPort, localAddress, localPort, 1771f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti streaming); 1781f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti return; 1791f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti } catch(SecurityException e1) { 1801f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti getLogger().log(Level.INFO, dstAddress + "(" + dstPort + "): " + 1811f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti e1.getClass().getName() + ": " + e1.getMessage()); 1821f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti } catch(IOException e2) { 1831f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti getLogger().log(Level.INFO, dstAddress + "(" + dstPort + "): " + 1841f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti e2.getClass().getName() + ": " + e2.getMessage()); 1851f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti } 1861f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti } 1871f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti 1881f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti // Now try to connect to the last address in the array, handing back to 1891f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti // the caller any exceptions that are thrown. 1901f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti dstAddress = dstAddresses[dstAddresses.length - 1]; 1911f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti checkDestination(dstAddress, dstPort); 1921f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti startupSocket(dstAddress, dstPort, localAddress, localPort, streaming); 1931f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti } 1941f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti // END android-added 1951f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti 196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Creates a new streaming socket connected to the target host specified by 198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the parameters {@code dstName} and {@code dstPort}. The socket is bound 199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * to any available port on the local host. 2001f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti * <p><strong>Implementation note:</strong> this implementation tries each 2011f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti * IP address for the given hostname until it either connects successfully 2021f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti * or it exhausts the set. It will try both IPv4 and IPv6 addresses in the 2031f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti * order specified by {@code preferIPv6Addresses}. 204f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param dstName 206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the target host name or IP address to connect to. 207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param dstPort 208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the port on the target host to connect to. 209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws UnknownHostException 210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the host name could not be resolved into an IP address. 211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an error occurs while creating the socket. 213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws SecurityException 214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if a security manager exists and it denies the permission to 215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * connect to the given address and port. 216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public Socket(String dstName, int dstPort) throws UnknownHostException, 218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project IOException { 2191f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti // BEGIN android-changed 2201f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti this(dstName, dstPort, null, 0); 2211f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti // END android-changed 222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 224adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Creates a new streaming socket connected to the target host specified by 226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the parameters {@code dstName} and {@code dstPort}. On the local endpoint 227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the socket is bound to the given address {@code localAddress} on port 228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code localPort}. 229f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * If {@code host} is {@code null} a loopback address is used to connect to. 2311f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti * <p><strong>Implementation note:</strong> this implementation tries each 2321f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti * IP address for the given hostname until it either connects successfully 2331f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti * or it exhausts the set. It will try both IPv4 and IPv6 addresses in the 2341f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti * order specified by {@code preferIPv6Addresses}. 235f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param dstName 237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the target host name or IP address to connect to. 238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param dstPort 239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the port on the target host to connect to. 240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param localAddress 241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the address on the local host to bind to. 242adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param localPort 243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the port on the local host to bind to. 244adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws UnknownHostException 245adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the host name could not be resolved into an IP address. 246adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 247adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an error occurs while creating the socket. 248adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws SecurityException 249adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if a security manager exists and it denies the permission to 250adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * connect to the given address and port. 251adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 252adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public Socket(String dstName, int dstPort, InetAddress localAddress, 253adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int localPort) throws IOException { 254adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this(); 2551f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti // BEGIN android-changed 2561f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti tryAllAddresses(dstName, dstPort, localAddress, localPort, true); 2571f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti // END android-changed 258adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 259adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 260adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 261adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Creates a new streaming or datagram socket connected to the target host 262adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * specified by the parameters {@code hostName} and {@code port}. The socket 263adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * is bound to any available port on the local host. 2641f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti * <p><strong>Implementation note:</strong> this implementation tries each 2651f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti * IP address for the given hostname until it either connects successfully 2661f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti * or it exhausts the set. It will try both IPv4 and IPv6 addresses in the 2671f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti * order specified by {@code preferIPv6Addresses}. 268f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 269adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param hostName 270adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the target host name or IP address to connect to. 271adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param port 272adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the port on the target host to connect to. 273adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param streaming 274adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if {@code true} a streaming socket is returned, a datagram 275adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * socket otherwise. 276adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws UnknownHostException 277adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the host name could not be resolved into an IP address. 278adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 279adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an error occurs while creating the socket. 280adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws SecurityException 281adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if a security manager exists and it denies the permission to 282adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * connect to the given address and port. 283adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @deprecated Use {@code Socket(String, int)} instead of this for streaming 284adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * sockets or an appropriate constructor of {@code 285adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * DatagramSocket} for UDP transport. 286adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 287adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Deprecated 288adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public Socket(String hostName, int port, boolean streaming) 289adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throws IOException { 290adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this(); 2911f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti // BEGIN android-changed 2921f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti tryAllAddresses(hostName, port, null, 0, streaming); 2931f2d2815dc31bf3c464eec6d1de7e428d7f1dcf6Lorenzo Colitti // END android-changed 294adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 295adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 296adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 297adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Creates a new streaming socket connected to the target host specified by 298adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the parameters {@code dstAddress} and {@code dstPort}. The socket is 299adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * bound to any available port on the local host. 300f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 301adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param dstAddress 302adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the target host address to connect to. 303adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param dstPort 304adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the port on the target host to connect to. 305adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 306adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an error occurs while creating the socket. 307adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws SecurityException 308adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if a security manager exists and it denies the permission to 309adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * connect to the given address and port. 310adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 311adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public Socket(InetAddress dstAddress, int dstPort) throws IOException { 312adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this(); 313adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project checkDestination(dstAddress, dstPort); 314adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project startupSocket(dstAddress, dstPort, null, 0, true); 315adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 316adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 317adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 318adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Creates a new streaming socket connected to the target host specified by 319adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the parameters {@code dstAddress} and {@code dstPort}. On the local 320adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * endpoint the socket is bound to the given address {@code localAddress} on 321adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * port {@code localPort}. 322f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 323adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param dstAddress 324adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the target host address to connect to. 325adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param dstPort 326adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the port on the target host to connect to. 327adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param localAddress 328adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the address on the local host to bind to. 329adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param localPort 330adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the port on the local host to bind to. 331adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 332adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an error occurs while creating the socket. 333adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws SecurityException 334adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if a security manager exists and it denies the permission to 335adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * connect to the given address and port. 336adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 337adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public Socket(InetAddress dstAddress, int dstPort, 338adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project InetAddress localAddress, int localPort) throws IOException { 339adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this(); 340adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project checkDestination(dstAddress, dstPort); 341adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project startupSocket(dstAddress, dstPort, localAddress, localPort, true); 342adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 343adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 344adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 345adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Creates a new streaming or datagram socket connected to the target host 346adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * specified by the parameters {@code addr} and {@code port}. The socket is 347adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * bound to any available port on the local host. 348f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 349adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param addr 350adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the Internet address to connect to. 351adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param port 352adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the port on the target host to connect to. 353adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param streaming 354adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if {@code true} a streaming socket is returned, a datagram 355adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * socket otherwise. 356adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 357adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an error occurs while creating the socket. 358adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws SecurityException 359adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if a security manager exists and it denies the permission to 360adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * connect to the given address and port. 361adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @deprecated Use {@code Socket(InetAddress, int)} instead of this for 362adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * streaming sockets or an appropriate constructor of {@code 363adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * DatagramSocket} for UDP transport. 364adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 365adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Deprecated 366adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public Socket(InetAddress addr, int port, boolean streaming) 367adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throws IOException { 368adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this(); 369adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project checkDestination(addr, port); 370adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project startupSocket(addr, port, null, 0, streaming); 371adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 372adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 373adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 374adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Creates an unconnected socket with the given socket implementation. 375f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 376adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param anImpl 377adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the socket implementation to be used. 378adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws SocketException 379adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an error occurs while creating the socket. 380adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 381adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project protected Socket(SocketImpl anImpl) throws SocketException { 382adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project impl = anImpl; 383adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 384adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 385adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 386adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Checks whether the connection destination satisfies the security policy 387adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * and the validity of the port range. 388f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 389adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param destAddr 390adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the destination host address. 391adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param dstPort 392adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the port on the destination host. 393adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 394adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project void checkDestination(InetAddress destAddr, int dstPort) { 395adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (dstPort < 0 || dstPort > 65535) { 396adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new IllegalArgumentException(Msg.getString("K0032")); //$NON-NLS-1$ 397adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 398adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // BEGIN android-changed 399adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project checkConnectPermission(destAddr.getHostAddress(), dstPort); 400adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // END android-changed 401adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 402adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 403adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 404adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Checks whether the connection destination satisfies the security policy. 405f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 406adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param hostname 407adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the destination hostname. 408adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param dstPort 409adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the port on the destination host. 410adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 411adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private void checkConnectPermission(String hostname, int dstPort) { 412adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project SecurityManager security = System.getSecurityManager(); 413adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (security != null) { 414adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project security.checkConnect(hostname, dstPort); 415adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 416adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 417adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 418adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 419adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Closes the socket. It is not possible to reconnect or rebind to this 420adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * socket thereafter which means a new socket instance has to be created. 421f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 422adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 423adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an error occurs while closing the socket. 424adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 425adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public synchronized void close() throws IOException { 426adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project isClosed = true; 427adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project impl.close(); 428adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 429adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 430adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 431adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Gets the IP address of the target host this socket is connected to. 432f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 433adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the IP address of the connected target host or {@code null} if 434adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * this socket is not yet connected. 435adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 436adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public InetAddress getInetAddress() { 437adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (!isConnected()) { 438adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return null; 439adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 440adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return impl.getInetAddress(); 441adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 442adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 443adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 444adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Gets an input stream to read data from this socket. 445f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 446adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the byte-oriented input stream. 447adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 448adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an error occurs while creating the input stream or the 449adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * socket is in an invalid state. 450adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 451adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public InputStream getInputStream() throws IOException { 452adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project checkClosedAndCreate(false); 453adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (isInputShutdown()) { 454adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new SocketException(Msg.getString("K0321")); //$NON-NLS-1$ 455adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 456adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return impl.getInputStream(); 457adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 458adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 459adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 460adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Gets the setting of the socket option {@code SocketOptions.SO_KEEPALIVE}. 461f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 462adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return {@code true} if the {@code SocketOptions.SO_KEEPALIVE} is 463adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * enabled, {@code false} otherwise. 464adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws SocketException 465adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an error occurs while reading the socket option. 466adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see SocketOptions#SO_KEEPALIVE 467adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 468adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public boolean getKeepAlive() throws SocketException { 469adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project checkClosedAndCreate(true); 470adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return ((Boolean) impl.getOption(SocketOptions.SO_KEEPALIVE)) 471adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project .booleanValue(); 472adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 473adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 474adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 475adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Gets the local IP address this socket is bound to. 476f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 477adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the local IP address of this socket or {@code InetAddress.ANY} if 478adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the socket is unbound. 479adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 480adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public InetAddress getLocalAddress() { 481adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (!isBound()) { 482adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return InetAddress.ANY; 483adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 484adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return Platform.getNetworkSystem().getSocketLocalAddress(impl.fd, 485adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project InetAddress.preferIPv6Addresses()); 486adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 487adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 488adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 489adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Gets the local port this socket is bound to. 490f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 491adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the local port of this socket or {@code -1} if the socket is 492adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * unbound. 493adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 494adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public int getLocalPort() { 495adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (!isBound()) { 496adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return -1; 497adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 498adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return impl.getLocalPort(); 499adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 500adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 501adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 502adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Gets an output stream to write data into this socket. 503f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 504adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the byte-oriented output stream. 505adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 506adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an error occurs while creating the output stream or the 507adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * socket is in an invalid state. 508adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 509adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public OutputStream getOutputStream() throws IOException { 510adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project checkClosedAndCreate(false); 511adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (isOutputShutdown()) { 512adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new SocketException(Msg.getString("KA00f")); //$NON-NLS-1$ 513adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 514adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return impl.getOutputStream(); 515adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 516adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 517adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 518adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Gets the port number of the target host this socket is connected to. 519f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 520adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the port number of the connected target host or {@code 0} if this 521adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * socket is not yet connected. 522adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 523adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public int getPort() { 524adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (!isConnected()) { 525adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return 0; 526adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 527adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return impl.getPort(); 528adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 529adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 530adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 531adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Gets the value of the socket option {@code SocketOptions.SO_LINGER}. 532f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 533adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the current value of the option {@code SocketOptions.SO_LINGER} 534adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * or {@code -1} if this option is disabled. 535adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws SocketException 536adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an error occurs while reading the socket option. 537adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see SocketOptions#SO_LINGER 538adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 539adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public int getSoLinger() throws SocketException { 540adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project checkClosedAndCreate(true); 541adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return ((Integer) impl.getOption(SocketOptions.SO_LINGER)).intValue(); 542adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 543adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 544adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 545adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Gets the receive buffer size of this socket. 546f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 547adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the current value of the option {@code SocketOptions.SO_RCVBUF}. 548adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws SocketException 549adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an error occurs while reading the socket option. 550adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see SocketOptions#SO_RCVBUF 551adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 552adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public synchronized int getReceiveBufferSize() throws SocketException { 553adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project checkClosedAndCreate(true); 554adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return ((Integer) impl.getOption(SocketOptions.SO_RCVBUF)).intValue(); 555adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 556adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 557adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 558adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Gets the send buffer size of this socket. 559f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 560adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the current value of the option {@code SocketOptions.SO_SNDBUF}. 561adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws SocketException 562adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an error occurs while reading the socket option. 563adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see SocketOptions#SO_SNDBUF 564adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 565adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public synchronized int getSendBufferSize() throws SocketException { 566adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project checkClosedAndCreate(true); 567adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return ((Integer) impl.getOption(SocketOptions.SO_SNDBUF)).intValue(); 568adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 569adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 570adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 571adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Gets the timeout for this socket during which a reading operation shall 572adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * block while waiting for data. 573f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 574adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the current value of the option {@code SocketOptions.SO_TIMEOUT} 575adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * or {@code 0} which represents an infinite timeout. 576adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws SocketException 577adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an error occurs while reading the socket option. 578adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see SocketOptions#SO_TIMEOUT 579adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 580adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public synchronized int getSoTimeout() throws SocketException { 581adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project checkClosedAndCreate(true); 582adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return ((Integer) impl.getOption(SocketOptions.SO_TIMEOUT)).intValue(); 583adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 584adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 585adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 586adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Gets the setting of the socket option {@code SocketOptions.TCP_NODELAY}. 587f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 588adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return {@code true} if the {@code SocketOptions.TCP_NODELAY} is enabled, 589adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code false} otherwise. 590adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws SocketException 591adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an error occurs while reading the socket option. 592adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see SocketOptions#TCP_NODELAY 593adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 594adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public boolean getTcpNoDelay() throws SocketException { 595adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project checkClosedAndCreate(true); 596adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return ((Boolean) impl.getOption(SocketOptions.TCP_NODELAY)) 597adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project .booleanValue(); 598adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 599adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 600adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 601adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Sets the state of the {@code SocketOptions.SO_KEEPALIVE} for this socket. 602f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 603adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param value 604adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the state whether this option is enabled or not. 605adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws SocketException 606adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an error occurs while setting the option. 607adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see SocketOptions#SO_KEEPALIVE 608adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 609adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void setKeepAlive(boolean value) throws SocketException { 610adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (impl != null) { 611adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project checkClosedAndCreate(true); 612adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project impl.setOption(SocketOptions.SO_KEEPALIVE, value ? Boolean.TRUE 613adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project : Boolean.FALSE); 614adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 615adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 616adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 617adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 618adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Sets the internal factory for creating socket implementations. This may 619adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * only be executed once during the lifetime of the application. 620f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 621adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param fac 622adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the socket implementation factory to be set. 623adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 624adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the factory has been already set. 625adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 626adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static synchronized void setSocketImplFactory(SocketImplFactory fac) 627adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throws IOException { 628adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project SecurityManager security = System.getSecurityManager(); 629adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (security != null) { 630adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project security.checkSetFactory(); 631adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 632adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (factory != null) { 633adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new SocketException(Msg.getString("K0044")); //$NON-NLS-1$ 634adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 635adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project factory = fac; 636adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 637adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 638adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 639adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Sets the send buffer size of this socket. 640f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 641adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param size 642adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the buffer size in bytes. This value must be a positive number 643adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * greater than {@code 0}. 644adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws SocketException 645adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an error occurs while setting the size or the given value 646adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * is an invalid size. 647adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see SocketOptions#SO_SNDBUF 648adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 649adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public synchronized void setSendBufferSize(int size) throws SocketException { 650adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project checkClosedAndCreate(true); 651adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (size < 1) { 652adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new IllegalArgumentException(Msg.getString("K0035")); //$NON-NLS-1$ 653adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 654adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project impl.setOption(SocketOptions.SO_SNDBUF, Integer.valueOf(size)); 655adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 656adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 657adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 658adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Sets the receive buffer size of this socket. 659f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 660adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param size 661adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the buffer size in bytes. This value must be a positive number 662adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * greater than {@code 0}. 663adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws SocketException 664adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an error occurs while setting the size or the given value 665adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * is an invalid size. 666adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see SocketOptions#SO_RCVBUF 667adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 668adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public synchronized void setReceiveBufferSize(int size) 669adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throws SocketException { 670adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project checkClosedAndCreate(true); 671adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (size < 1) { 672adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new IllegalArgumentException(Msg.getString("K0035")); //$NON-NLS-1$ 673adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 674adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project impl.setOption(SocketOptions.SO_RCVBUF, Integer.valueOf(size)); 675adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 676adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 677adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 678adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Sets the state of the {@code SocketOptions.SO_LINGER} with the given 679adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * timeout in seconds. The timeout value for this option is silently limited 680adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * to the maximum of {@code 65535}. 681f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 682adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param on 683adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the state whether this option is enabled or not. 684adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param timeout 685adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the linger timeout value in seconds. 686adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws SocketException 687adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an error occurs while setting the option. 688adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see SocketOptions#SO_LINGER 689adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 690adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void setSoLinger(boolean on, int timeout) throws SocketException { 691adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project checkClosedAndCreate(true); 692adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (on && timeout < 0) { 693adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new IllegalArgumentException(Msg.getString("K0045")); //$NON-NLS-1$ 694adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 695adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // BEGIN android-changed 696adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /* 697adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The spec indicates that the right way to turn off an option 698adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * is to pass Boolean.FALSE, so that's what we do here. 699adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 700adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (on) { 701adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (timeout > 65535) { 702adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project timeout = 65535; 703adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 704adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project impl.setOption(SocketOptions.SO_LINGER, Integer.valueOf(timeout)); 705adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else { 706adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project impl.setOption(SocketOptions.SO_LINGER, Boolean.FALSE); 707adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 708adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // END android-changed 709adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 710adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 711adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 712adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Sets the reading timeout in milliseconds for this socket. The read 713adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * operation will block indefinitely if this option value is set to {@code 714adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 0}. The timeout must be set before calling the read operation. A 715adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code SocketTimeoutException} is thrown when this timeout expires. 716f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 717adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param timeout 718adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the reading timeout value as number greater than {@code 0} or 719adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code 0} for an infinite timeout. 720adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws SocketException 721adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an error occurs while setting the option. 722adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see SocketOptions#SO_TIMEOUT 723adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 724adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public synchronized void setSoTimeout(int timeout) throws SocketException { 725adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project checkClosedAndCreate(true); 726adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (timeout < 0) { 727adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new IllegalArgumentException(Msg.getString("K0036")); //$NON-NLS-1$ 728adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 729adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project impl.setOption(SocketOptions.SO_TIMEOUT, Integer.valueOf(timeout)); 730adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 731adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 732adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 733adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Sets the state of the {@code SocketOptions.TCP_NODELAY} for this socket. 734f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 735adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param on 736adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the state whether this option is enabled or not. 737adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws SocketException 738adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an error occurs while setting the option. 739adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see SocketOptions#TCP_NODELAY 740adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 741adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void setTcpNoDelay(boolean on) throws SocketException { 742adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project checkClosedAndCreate(true); 743adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project impl.setOption(SocketOptions.TCP_NODELAY, Boolean.valueOf(on)); 744adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 745adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 746adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 747adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Creates a stream socket, binds it to the nominated local address/port, 748adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * then connects it to the nominated destination address/port. 749f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 750adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param dstAddress 751adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the destination host address. 752adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param dstPort 753adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the port on the destination host. 754adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param localAddress 755adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the address on the local machine to bind. 756adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param localPort 757adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the port on the local machine to bind. 758adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 759adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * thrown if an error occurs during the bind or connect 760adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * operations. 761adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 762adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project void startupSocket(InetAddress dstAddress, int dstPort, 763adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project InetAddress localAddress, int localPort, boolean streaming) 764adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throws IOException { 765adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 766adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (localPort < 0 || localPort > 65535) { 767adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new IllegalArgumentException(Msg.getString("K0046")); //$NON-NLS-1$ 768adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 769adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 770adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project InetAddress addr = localAddress == null ? InetAddress.ANY 771adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project : localAddress; 772adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project synchronized (this) { 773adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project impl.create(streaming); 774adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project isCreated = true; 775adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 776adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (!streaming || !NetUtil.usingSocks(proxy)) { 777adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project impl.bind(addr, localPort); 778adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 779adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project isBound = true; 780adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project impl.connect(dstAddress, dstPort); 781adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project isConnected = true; 782adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (IOException e) { 783adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project impl.close(); 784adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw e; 785adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 786adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 787adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 788adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 789adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 790adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns a {@code String} containing a concise, human-readable description of the 791adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * socket. 792f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 793adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the textual representation of this socket. 794adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 795adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 796adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public String toString() { 797adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (!isConnected()) { 798adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return "Socket[unconnected]"; //$NON-NLS-1$ 799adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 800adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return impl.toString(); 801adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 802adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 803adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 804adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Closes the input stream of this socket. Any further data sent to this 805adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * socket will be discarded. Reading from this socket after this method has 806adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * been called will return the value {@code EOF}. 807f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 808adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 809adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an error occurs while closing the socket input stream. 810adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws SocketException 811adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the input stream is already closed. 812adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 813adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void shutdownInput() throws IOException { 814adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (isInputShutdown()) { 815adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new SocketException(Msg.getString("K0321")); //$NON-NLS-1$ 816adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 817adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project checkClosedAndCreate(false); 818adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project impl.shutdownInput(); 819adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project isInputShutdown = true; 820adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 821adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 822adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 823adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Closes the output stream of this socket. All buffered data will be sent 824adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * followed by the termination sequence. Writing to the closed output stream 825adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * will cause an {@code IOException}. 826f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 827adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 828adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an error occurs while closing the socket output stream. 829adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws SocketException 830adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the output stream is already closed. 831adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 832adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void shutdownOutput() throws IOException { 833adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (isOutputShutdown()) { 834adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new SocketException(Msg.getString("KA00f")); //$NON-NLS-1$ 835adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 836adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project checkClosedAndCreate(false); 837adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project impl.shutdownOutput(); 838adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project isOutputShutdown = true; 839adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 840adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 841adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 842adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Checks whether the socket is closed, and throws an exception. Otherwise 843adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * creates the underlying SocketImpl. 844f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 845adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws SocketException 846adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the socket is closed. 847adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 848adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private void checkClosedAndCreate(boolean create) throws SocketException { 849adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (isClosed()) { 850adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new SocketException(Msg.getString("K003d")); //$NON-NLS-1$ 851adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 852adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (!create) { 853adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (!isConnected()) { 854adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new SocketException(Msg.getString("K0320")); //$NON-NLS-1$ 855adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // a connected socket must be created 856adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 857adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 858adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /* 859adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * return directly to fix a possible bug, if !create, should return 860adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * here 861adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 862adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return; 863adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 864adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (isCreated) { 865adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return; 866adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 867adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project synchronized (this) { 868adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (isCreated) { 869adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return; 870adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 871adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 872adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project impl.create(true); 873adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (SocketException e) { 874adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw e; 875adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (IOException e) { 876adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new SocketException(e.toString()); 877adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 878adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project isCreated = true; 879adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 880adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 881adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 882adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 883adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Gets the local address and port of this socket as a SocketAddress or 884adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code null} if the socket is unbound. This is useful on multihomed 885adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * hosts. 886f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 887adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the bound local socket address and port. 888adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 889adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public SocketAddress getLocalSocketAddress() { 890adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (!isBound()) { 891adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return null; 892adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 893adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return new InetSocketAddress(getLocalAddress(), getLocalPort()); 894adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 895adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 896adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 897adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Gets the remote address and port of this socket as a {@code 898adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * SocketAddress} or {@code null} if the socket is not connected. 899f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 900adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the remote socket address and port. 901adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 902adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public SocketAddress getRemoteSocketAddress() { 903adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (!isConnected()) { 904adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return null; 905adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 906adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return new InetSocketAddress(getInetAddress(), getPort()); 907adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 908adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 909adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 910adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns whether this socket is bound to a local address and port. 911f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 912adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return {@code true} if the socket is bound to a local address, {@code 913adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * false} otherwise. 914adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 915adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public boolean isBound() { 916adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return isBound; 917adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 918adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 919adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 920adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns whether this socket is connected to a remote host. 921f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 922adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return {@code true} if the socket is connected, {@code false} otherwise. 923adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 924adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public boolean isConnected() { 925adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return isConnected; 926adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 927adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 928adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 929adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns whether this socket is closed. 930f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 931adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return {@code true} if the socket is closed, {@code false} otherwise. 932adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 933adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public boolean isClosed() { 934adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return isClosed; 935adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 936adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 937adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 938adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Binds this socket to the given local host address and port specified by 939adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the SocketAddress {@code localAddr}. If {@code localAddr} is set to 940adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code null}, this socket will be bound to an available local address on 941adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * any free port. 942f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 943adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param localAddr 944adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the specific address and port on the local machine to bind to. 945adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IllegalArgumentException 946adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the given SocketAddress is invalid or not supported. 947adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 948adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the socket is already bound or an error occurs while 949adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * binding. 950adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 951adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void bind(SocketAddress localAddr) throws IOException { 952adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project checkClosedAndCreate(true); 953adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (isBound()) { 954adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new BindException(Msg.getString("K0315")); //$NON-NLS-1$ 955adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 956adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 957adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int port = 0; 958adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project InetAddress addr = InetAddress.ANY; 959adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (localAddr != null) { 960adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (!(localAddr instanceof InetSocketAddress)) { 961adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new IllegalArgumentException(Msg.getString( 962adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project "K0316", localAddr.getClass())); //$NON-NLS-1$ 963adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 964adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project InetSocketAddress inetAddr = (InetSocketAddress) localAddr; 965adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if ((addr = inetAddr.getAddress()) == null) { 966adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new SocketException(Msg.getString( 967adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project "K0317", inetAddr.getHostName())); //$NON-NLS-1$ 968adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 969adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project port = inetAddr.getPort(); 970adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 971adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 972adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project synchronized (this) { 973adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 974adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project impl.bind(addr, port); 975adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project isBound = true; 976adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (IOException e) { 977adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project impl.close(); 978adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw e; 979adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 980adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 981adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 982adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 983adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 984adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Connects this socket to the given remote host address and port specified 985adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * by the SocketAddress {@code remoteAddr}. 986f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 987adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param remoteAddr 988adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the address and port of the remote host to connect to. 989adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IllegalArgumentException 990adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the given SocketAddress is invalid or not supported. 991adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 992adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the socket is already connected or an error occurs while 993adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * connecting. 994adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 995adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void connect(SocketAddress remoteAddr) throws IOException { 996adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project connect(remoteAddr, 0); 997adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 998adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 999adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 1000adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Connects this socket to the given remote host address and port specified 1001adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * by the SocketAddress {@code remoteAddr} with the specified timeout. The 1002adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * connecting method will block until the connection is established or an 1003adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * error occurred. 1004f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 1005adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param remoteAddr 1006adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the address and port of the remote host to connect to. 1007adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param timeout 1008adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the timeout value in milliseconds or {@code 0} for an infinite 1009adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * timeout. 1010adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IllegalArgumentException 1011adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the given SocketAddress is invalid or not supported or the 1012adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * timeout value is negative. 1013adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 1014adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the socket is already connected or an error occurs while 1015adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * connecting. 1016adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 1017adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void connect(SocketAddress remoteAddr, int timeout) 1018adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throws IOException { 1019adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project checkClosedAndCreate(true); 1020adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (timeout < 0) { 1021adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new IllegalArgumentException(Msg.getString("K0036")); //$NON-NLS-1$ 1022adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1023adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (isConnected()) { 1024adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new SocketException(Msg.getString("K0079")); //$NON-NLS-1$ 1025adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1026adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (remoteAddr == null) { 1027adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new IllegalArgumentException(Msg.getString("K0318")); //$NON-NLS-1$ 1028adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1029adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1030adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (!(remoteAddr instanceof InetSocketAddress)) { 1031adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new IllegalArgumentException(Msg.getString( 1032adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project "K0316", remoteAddr.getClass())); //$NON-NLS-1$ 1033adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1034adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project InetSocketAddress inetAddr = (InetSocketAddress) remoteAddr; 1035adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project InetAddress addr; 1036adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if ((addr = inetAddr.getAddress()) == null) { 1037adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new UnknownHostException(Msg.getString("K0317", remoteAddr));//$NON-NLS-1$ 1038adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1039adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int port = inetAddr.getPort(); 1040adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1041adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project checkDestination(addr, port); 1042adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project synchronized (connectLock) { 1043adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 1044adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (!isBound()) { 1045adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // socket allready created at this point by earlier call or 1046adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // checkClosedAndCreate this caused us to lose socket 1047adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // options on create 1048adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // impl.create(true); 1049adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (!NetUtil.usingSocks(proxy)) { 1050adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project impl.bind(InetAddress.ANY, 0); 1051adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1052adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project isBound = true; 1053adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1054adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project impl.connect(remoteAddr, timeout); 1055adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project isConnected = true; 1056adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (IOException e) { 1057adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project impl.close(); 1058adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw e; 1059adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1060adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1061adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1062adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1063adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 1064adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns whether the incoming channel of the socket has already been 1065adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * closed. 1066f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 1067adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return {@code true} if reading from this socket is not possible anymore, 1068adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code false} otherwise. 1069adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 1070adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public boolean isInputShutdown() { 1071adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return isInputShutdown; 1072adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1073adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1074adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 1075f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * Returns whether the outgoing channel of the socket has already been 1076adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * closed. 1077f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 1078adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return {@code true} if writing to this socket is not possible anymore, 1079adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code false} otherwise. 1080adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 1081adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public boolean isOutputShutdown() { 1082adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return isOutputShutdown; 1083adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1084adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1085adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 1086adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Sets the state of the {@code SocketOptions.SO_REUSEADDR} for this socket. 1087f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 1088adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param reuse 1089adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the state whether this option is enabled or not. 1090adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws SocketException 1091adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an error occurs while setting the option. 1092adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see SocketOptions#SO_REUSEADDR 1093adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 1094adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void setReuseAddress(boolean reuse) throws SocketException { 1095adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project checkClosedAndCreate(true); 1096adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project impl.setOption(SocketOptions.SO_REUSEADDR, reuse ? Boolean.TRUE 1097adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project : Boolean.FALSE); 1098adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1099adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 1101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Gets the setting of the socket option {@code SocketOptions.SO_REUSEADDR}. 1102f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 1103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return {@code true} if the {@code SocketOptions.SO_REUSEADDR} is 1104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * enabled, {@code false} otherwise. 1105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws SocketException 1106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an error occurs while reading the socket option. 1107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see SocketOptions#SO_REUSEADDR 1108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 1109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public boolean getReuseAddress() throws SocketException { 1110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project checkClosedAndCreate(true); 1111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return ((Boolean) impl.getOption(SocketOptions.SO_REUSEADDR)) 1112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project .booleanValue(); 1113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 1116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Sets the state of the {@code SocketOptions.SO_OOBINLINE} for this socket. 1117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * When this option is enabled urgent data can be received in-line with 1118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * normal data. 1119f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 1120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param oobinline 1121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * whether this option is enabled or not. 1122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws SocketException 1123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an error occurs while setting the option. 1124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see SocketOptions#SO_OOBINLINE 1125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 1126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void setOOBInline(boolean oobinline) throws SocketException { 1127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project checkClosedAndCreate(true); 1128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project impl.setOption(SocketOptions.SO_OOBINLINE, oobinline ? Boolean.TRUE 1129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project : Boolean.FALSE); 1130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 1133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Gets the setting of the socket option {@code SocketOptions.SO_OOBINLINE}. 1134f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 1135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return {@code true} if the {@code SocketOptions.SO_OOBINLINE} is 1136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * enabled, {@code false} otherwise. 1137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws SocketException 1138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an error occurs while reading the socket option. 1139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see SocketOptions#SO_OOBINLINE 1140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 1141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public boolean getOOBInline() throws SocketException { 1142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project checkClosedAndCreate(true); 1143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return ((Boolean) impl.getOption(SocketOptions.SO_OOBINLINE)) 1144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project .booleanValue(); 1145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 1148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Sets the value of the {@code SocketOptions.IP_TOS} for this socket. See 1149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the specification RFC 1349 for more information about the type of service 1150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * field. 1151f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 1152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param value 1153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the value to be set for this option with a valid range of 1154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code 0-255}. 1155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws SocketException 1156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an error occurs while setting the option. 1157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see SocketOptions#IP_TOS 1158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 1159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void setTrafficClass(int value) throws SocketException { 1160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project checkClosedAndCreate(true); 1161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (value < 0 || value > 255) { 1162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new IllegalArgumentException(); 1163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project impl.setOption(SocketOptions.IP_TOS, Integer.valueOf(value)); 1165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 1168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Gets the value of the socket option {@code SocketOptions.IP_TOS}. 1169f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 1170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the value which represents the type of service. 1171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws SocketException 1172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an error occurs while reading the socket option. 1173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see SocketOptions#IP_TOS 1174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 1175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public int getTrafficClass() throws SocketException { 1176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project checkClosedAndCreate(true); 1177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return ((Number) impl.getOption(SocketOptions.IP_TOS)).intValue(); 1178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 1181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Sends the given single byte data which is represented by the lowest octet 1182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * of {@code value} as "TCP urgent data". 1183f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 1184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param value 1185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the byte of urgent data to be sent. 1186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 1187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an error occurs while sending urgent data. 1188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 1189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void sendUrgentData(int value) throws IOException { 1190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (!impl.supportsUrgentData()) { 1191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new SocketException(Msg.getString("K0333")); //$NON-NLS-1$ 1192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project impl.sendUrgentData(value); 1194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 1197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Set the appropriate flags for a socket created by {@code 1198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * ServerSocket.accept()}. 1199f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 1200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see ServerSocket#implAccept 1201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 1202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project void accepted() { 1203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project isCreated = isBound = isConnected = true; 1204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project static boolean preferIPv4Stack() { 1207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String result = AccessController.doPrivileged(new PriviAction<String>( 1208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project "java.net.preferIPv4Stack")); //$NON-NLS-1$ 1209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return "true".equals(result); //$NON-NLS-1$ 1210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 1213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Gets the SocketChannel of this socket, if one is available. The current 1214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * implementation of this method returns always {@code null}. 1215f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 1216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the related SocketChannel or {@code null} if no channel exists. 1217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 1218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public SocketChannel getChannel() { 1219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return null; 1220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 1223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Sets performance preferences for connectionTime, latency and bandwidth. 1224adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 1225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * This method does currently nothing. 1226f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 1227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param connectionTime 1228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the value representing the importance of a short connecting 1229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * time. 1230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param latency 1231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the value representing the importance of low latency. 1232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param bandwidth 1233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the value representing the importance of high bandwidth. 1234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 1235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void setPerformancePreferences(int connectionTime, int latency, 1236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int bandwidth) { 1237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Our socket implementation only provide one protocol: TCP/IP, so 1238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // we do nothing for this method 1239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 1241