PlainDatagramSocketImpl.java revision 12f2d8e2760b78c673b7a187b9062b3938a03147
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 org.apache.harmony.luni.net; 19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 20f7aab022dcbfcd8f27b409ab92b4bca4a84d0b8aBrian Carlstromimport dalvik.system.CloseGuard; 21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.FileDescriptor; 22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.IOException; 23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.net.DatagramPacket; 24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.net.DatagramSocketImpl; 25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.net.InetAddress; 26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.net.InetSocketAddress; 270b29a1fecc601de2f642ded891726ac3e460d74bElliott Hughesimport java.net.MulticastGroupRequest; 28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.net.NetworkInterface; 29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.net.SocketAddress; 30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.net.SocketException; 31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.net.UnknownHostException; 32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.apache.harmony.luni.platform.Platform; 33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/** 35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The default, concrete instance of datagram sockets. This class does not 36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * support security checks. Alternative types of DatagramSocketImpl's may be 37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * used by setting the <code>impl.prefix</code> system property. 38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 39f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilsonpublic class PlainDatagramSocketImpl extends DatagramSocketImpl { 40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 410b29a1fecc601de2f642ded891726ac3e460d74bElliott Hughes private static final int MCAST_JOIN_GROUP = 19; 420b29a1fecc601de2f642ded891726ac3e460d74bElliott Hughes private static final int MCAST_LEAVE_GROUP = 20; 430b29a1fecc601de2f642ded891726ac3e460d74bElliott Hughes 44f3afb1b6a4ace33bd60e5801bdb2fcb2e935d486Elliott Hughes private static final int SO_BROADCAST = 32; 45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project final static int IP_MULTICAST_TTL = 17; 47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private volatile boolean isNativeConnected; 49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 5012f2d8e2760b78c673b7a187b9062b3938a03147Brian Carlstrom private final CloseGuard guard = CloseGuard.get(); 51f7aab022dcbfcd8f27b409ab92b4bca4a84d0b8aBrian Carlstrom 52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * used to keep address to which the socket was connected to at the native 54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * level 55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private InetAddress connectedAddress; 57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private int connectedPort = -1; 59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public PlainDatagramSocketImpl(FileDescriptor fd, int localPort) { 61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project super(); 62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.fd = fd; 63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.localPort = localPort; 64f7aab022dcbfcd8f27b409ab92b4bca4a84d0b8aBrian Carlstrom if (fd.valid()) { 65f7aab022dcbfcd8f27b409ab92b4bca4a84d0b8aBrian Carlstrom guard.open("close"); 66f7aab022dcbfcd8f27b409ab92b4bca4a84d0b8aBrian Carlstrom } 67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public PlainDatagramSocketImpl() { 70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project super(); 71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fd = new FileDescriptor(); 72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void bind(int port, InetAddress addr) throws SocketException { 763db0d1b07a79c3c871b0aa0929674adae3081b4fElliott Hughes Platform.NETWORK.bind(fd, addr, port); 773db0d1b07a79c3c871b0aa0929674adae3081b4fElliott Hughes if (port != 0) { 78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project localPort = port; 79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else { 803db0d1b07a79c3c871b0aa0929674adae3081b4fElliott Hughes localPort = Platform.NETWORK.getSocketLocalPort(fd); 81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project setOption(SO_BROADCAST, Boolean.TRUE); 8558e5a8e6eeaf94d78522e0e9994c4565a3b33fdbJesse Wilson } catch (IOException ignored) { 86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 90c6e0981e5a2d23a0758ed71a8086c4278a7832efJesse Wilson public synchronized void close() { 91f7aab022dcbfcd8f27b409ab92b4bca4a84d0b8aBrian Carlstrom guard.close(); 92c6e0981e5a2d23a0758ed71a8086c4278a7832efJesse Wilson try { 93c6e0981e5a2d23a0758ed71a8086c4278a7832efJesse Wilson Platform.NETWORK.close(fd); 94c6e0981e5a2d23a0758ed71a8086c4278a7832efJesse Wilson } catch (IOException ignored) { 95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void create() throws SocketException { 1003db0d1b07a79c3c871b0aa0929674adae3081b4fElliott Hughes Platform.NETWORK.socket(fd, false); 101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 103e2f58c9501eac730d048199906dc41fe8e4cd6e9Brian Carlstrom @Override protected void finalize() throws Throwable { 104e2f58c9501eac730d048199906dc41fe8e4cd6e9Brian Carlstrom try { 10512f2d8e2760b78c673b7a187b9062b3938a03147Brian Carlstrom if (guard != null) { 10612f2d8e2760b78c673b7a187b9062b3938a03147Brian Carlstrom guard.warnIfOpen(); 10712f2d8e2760b78c673b7a187b9062b3938a03147Brian Carlstrom } 10812f2d8e2760b78c673b7a187b9062b3938a03147Brian Carlstrom close(); 109e2f58c9501eac730d048199906dc41fe8e4cd6e9Brian Carlstrom } finally { 110e2f58c9501eac730d048199906dc41fe8e4cd6e9Brian Carlstrom super.finalize(); 111e2f58c9501eac730d048199906dc41fe8e4cd6e9Brian Carlstrom } 112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public Object getOption(int optID) throws SocketException { 1153db0d1b07a79c3c871b0aa0929674adae3081b4fElliott Hughes return Platform.NETWORK.getSocketOption(fd, optID); 116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public int getTimeToLive() throws IOException { 12058e5a8e6eeaf94d78522e0e9994c4565a3b33fdbJesse Wilson return (Integer) getOption(IP_MULTICAST_TTL); 121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public byte getTTL() throws IOException { 1254401c75ac7d85da33472d0398d8166df6ce4beb5Elliott Hughes return (byte) getTimeToLive(); 126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void join(InetAddress addr) throws IOException { 1300b29a1fecc601de2f642ded891726ac3e460d74bElliott Hughes setOption(MCAST_JOIN_GROUP, new MulticastGroupRequest(addr, null)); 131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void joinGroup(SocketAddress addr, NetworkInterface netInterface) throws IOException { 135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (addr instanceof InetSocketAddress) { 136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project InetAddress groupAddr = ((InetSocketAddress) addr).getAddress(); 1370b29a1fecc601de2f642ded891726ac3e460d74bElliott Hughes setOption(MCAST_JOIN_GROUP, new MulticastGroupRequest(groupAddr, netInterface)); 138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void leave(InetAddress addr) throws IOException { 1430b29a1fecc601de2f642ded891726ac3e460d74bElliott Hughes setOption(MCAST_LEAVE_GROUP, new MulticastGroupRequest(addr, null)); 144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 1470b29a1fecc601de2f642ded891726ac3e460d74bElliott Hughes public void leaveGroup(SocketAddress addr, NetworkInterface netInterface) throws IOException { 148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (addr instanceof InetSocketAddress) { 149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project InetAddress groupAddr = ((InetSocketAddress) addr).getAddress(); 1500b29a1fecc601de2f642ded891726ac3e460d74bElliott Hughes setOption(MCAST_LEAVE_GROUP, new MulticastGroupRequest(groupAddr, netInterface)); 151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project protected int peek(InetAddress sender) throws IOException { 156753dcd862b31e85766225590d90ba0b9f481176fElliott Hughes // We don't actually want the data: we just want the DatagramPacket's filled-in address. 157753dcd862b31e85766225590d90ba0b9f481176fElliott Hughes byte[] bytes = new byte[0]; 158753dcd862b31e85766225590d90ba0b9f481176fElliott Hughes DatagramPacket packet = new DatagramPacket(bytes, bytes.length); 159753dcd862b31e85766225590d90ba0b9f481176fElliott Hughes int result = peekData(packet); 1603db0d1b07a79c3c871b0aa0929674adae3081b4fElliott Hughes Platform.NETWORK.setInetAddress(sender, packet.getAddress().getAddress()); 161753dcd862b31e85766225590d90ba0b9f481176fElliott Hughes return result; 162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 16479ff4e73fd689dae6667a8137ee57137962ff13aElliott Hughes private void doRecv(DatagramPacket pack, boolean peek) throws IOException { 1653db0d1b07a79c3c871b0aa0929674adae3081b4fElliott Hughes Platform.NETWORK.recv(fd, pack, pack.getData(), pack.getOffset(), pack.getLength(), peek, 1669f2b1b1c3bf9de560f29f257c855c7c85b405c0fElliott Hughes isNativeConnected); 1679f2b1b1c3bf9de560f29f257c855c7c85b405c0fElliott Hughes if (isNativeConnected) { 1689f2b1b1c3bf9de560f29f257c855c7c85b405c0fElliott Hughes updatePacketRecvAddress(pack); 169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 17379ff4e73fd689dae6667a8137ee57137962ff13aElliott Hughes public void receive(DatagramPacket pack) throws IOException { 17479ff4e73fd689dae6667a8137ee57137962ff13aElliott Hughes doRecv(pack, false); 17579ff4e73fd689dae6667a8137ee57137962ff13aElliott Hughes } 17679ff4e73fd689dae6667a8137ee57137962ff13aElliott Hughes 17779ff4e73fd689dae6667a8137ee57137962ff13aElliott Hughes @Override 17879ff4e73fd689dae6667a8137ee57137962ff13aElliott Hughes public int peekData(DatagramPacket pack) throws IOException { 17979ff4e73fd689dae6667a8137ee57137962ff13aElliott Hughes doRecv(pack, true); 18079ff4e73fd689dae6667a8137ee57137962ff13aElliott Hughes return pack.getPort(); 18179ff4e73fd689dae6667a8137ee57137962ff13aElliott Hughes } 18279ff4e73fd689dae6667a8137ee57137962ff13aElliott Hughes 18379ff4e73fd689dae6667a8137ee57137962ff13aElliott Hughes @Override 184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void send(DatagramPacket packet) throws IOException { 185221d0ccb4cc23ee0bf0646e9abe471fb48b3a1a8Elliott Hughes int port = isNativeConnected ? 0 : packet.getPort(); 186221d0ccb4cc23ee0bf0646e9abe471fb48b3a1a8Elliott Hughes InetAddress address = isNativeConnected ? null : packet.getAddress(); 187f7aab022dcbfcd8f27b409ab92b4bca4a84d0b8aBrian Carlstrom Platform.NETWORK.send(fd, packet.getData(), packet.getOffset(), packet.getLength(), 188f7aab022dcbfcd8f27b409ab92b4bca4a84d0b8aBrian Carlstrom port, address); 189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void setOption(int optID, Object val) throws SocketException { 1923db0d1b07a79c3c871b0aa0929674adae3081b4fElliott Hughes Platform.NETWORK.setSocketOption(fd, optID, val); 193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 196fdd13e86ec613e46b68376f90d2c89c2ac33b4b5Elliott Hughes public void setTimeToLive(int ttl) throws IOException { 197a9a57f2581773484d13e160fd3407692e825971aElliott Hughes setOption(IP_MULTICAST_TTL, Integer.valueOf(ttl)); 198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 201fdd13e86ec613e46b68376f90d2c89c2ac33b4b5Elliott Hughes public void setTTL(byte ttl) throws IOException { 2024d8e9333e494ceedff074def3b6e44f523f3830eElliott Hughes setTimeToLive((int) ttl & 0xff); // Avoid sign extension. 203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void connect(InetAddress inetAddr, int port) throws SocketException { 2073db0d1b07a79c3c871b0aa0929674adae3081b4fElliott Hughes Platform.NETWORK.connect(fd, inetAddr, port, 0); 208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // if we get here then we are connected at the native level 210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project connectedAddress = InetAddress.getByAddress(inetAddr.getAddress()); 212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (UnknownHostException e) { 213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // this is never expected to happen as we should not have gotten 214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // here if the address is not resolvable 215b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes throw new SocketException("Host is unresolved: " + inetAddr.getHostName()); 216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project connectedPort = port; 218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project isNativeConnected = true; 219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void disconnect() { 223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 2243db0d1b07a79c3c871b0aa0929674adae3081b4fElliott Hughes Platform.NETWORK.disconnectDatagram(fd); 22558e5a8e6eeaf94d78522e0e9994c4565a3b33fdbJesse Wilson } catch (Exception ignored) { 226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project connectedPort = -1; 228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project connectedAddress = null; 229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project isNativeConnected = false; 230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Set the received address and port in the packet. We do this when the 234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Datagram socket is connected at the native level and the 235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * recvConnnectedDatagramImpl does not update the packet with address from 236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * which the packet was received 237f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param packet 239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the packet to be updated 240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private void updatePacketRecvAddress(DatagramPacket packet) { 242adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project packet.setAddress(connectedAddress); 243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project packet.setPort(connectedPort); 244adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 245adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 246