PlainDatagramSocketImpl.java revision 8de7cf6bff36093dda9e25a1ab3718720cb54906
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 188de7cf6bff36093dda9e25a1ab3718720cb54906Elliott Hughespackage java.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; 326186821cb13f4ac7ff50950c813394367e021eaeJesse Wilsonimport libcore.util.EmptyArray; 33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.apache.harmony.luni.platform.Platform; 34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/** 368de7cf6bff36093dda9e25a1ab3718720cb54906Elliott Hughes * @hide used in java.nio. 37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 38f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilsonpublic class PlainDatagramSocketImpl extends DatagramSocketImpl { 39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 400b29a1fecc601de2f642ded891726ac3e460d74bElliott Hughes private static final int MCAST_JOIN_GROUP = 19; 410b29a1fecc601de2f642ded891726ac3e460d74bElliott Hughes private static final int MCAST_LEAVE_GROUP = 20; 420b29a1fecc601de2f642ded891726ac3e460d74bElliott Hughes 43f3afb1b6a4ace33bd60e5801bdb2fcb2e935d486Elliott Hughes private static final int SO_BROADCAST = 32; 44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 450d4ce4227fa818288b8db762b640dfa21e3162f5Elliott Hughes private static final int IP_MULTICAST_TTL = 17; 46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private volatile boolean isNativeConnected; 48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 4912f2d8e2760b78c673b7a187b9062b3938a03147Brian Carlstrom private final CloseGuard guard = CloseGuard.get(); 50f7aab022dcbfcd8f27b409ab92b4bca4a84d0b8aBrian Carlstrom 51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * used to keep address to which the socket was connected to at the native 53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * level 54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private InetAddress connectedAddress; 56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private int connectedPort = -1; 58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public PlainDatagramSocketImpl(FileDescriptor fd, int localPort) { 60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project super(); 61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.fd = fd; 62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.localPort = localPort; 63f7aab022dcbfcd8f27b409ab92b4bca4a84d0b8aBrian Carlstrom if (fd.valid()) { 64f7aab022dcbfcd8f27b409ab92b4bca4a84d0b8aBrian Carlstrom guard.open("close"); 65f7aab022dcbfcd8f27b409ab92b4bca4a84d0b8aBrian Carlstrom } 66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public PlainDatagramSocketImpl() { 69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project super(); 70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fd = new FileDescriptor(); 71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void bind(int port, InetAddress addr) throws SocketException { 753db0d1b07a79c3c871b0aa0929674adae3081b4fElliott Hughes Platform.NETWORK.bind(fd, addr, port); 763db0d1b07a79c3c871b0aa0929674adae3081b4fElliott Hughes if (port != 0) { 77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project localPort = port; 78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else { 793db0d1b07a79c3c871b0aa0929674adae3081b4fElliott Hughes localPort = Platform.NETWORK.getSocketLocalPort(fd); 80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project setOption(SO_BROADCAST, Boolean.TRUE); 8458e5a8e6eeaf94d78522e0e9994c4565a3b33fdbJesse Wilson } catch (IOException ignored) { 85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 89c6e0981e5a2d23a0758ed71a8086c4278a7832efJesse Wilson public synchronized void close() { 90f7aab022dcbfcd8f27b409ab92b4bca4a84d0b8aBrian Carlstrom guard.close(); 91c6e0981e5a2d23a0758ed71a8086c4278a7832efJesse Wilson try { 92c6e0981e5a2d23a0758ed71a8086c4278a7832efJesse Wilson Platform.NETWORK.close(fd); 93c6e0981e5a2d23a0758ed71a8086c4278a7832efJesse Wilson } catch (IOException ignored) { 94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void create() throws SocketException { 993db0d1b07a79c3c871b0aa0929674adae3081b4fElliott Hughes Platform.NETWORK.socket(fd, false); 100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 102e2f58c9501eac730d048199906dc41fe8e4cd6e9Brian Carlstrom @Override protected void finalize() throws Throwable { 103e2f58c9501eac730d048199906dc41fe8e4cd6e9Brian Carlstrom try { 10412f2d8e2760b78c673b7a187b9062b3938a03147Brian Carlstrom if (guard != null) { 10512f2d8e2760b78c673b7a187b9062b3938a03147Brian Carlstrom guard.warnIfOpen(); 10612f2d8e2760b78c673b7a187b9062b3938a03147Brian Carlstrom } 10712f2d8e2760b78c673b7a187b9062b3938a03147Brian Carlstrom close(); 108e2f58c9501eac730d048199906dc41fe8e4cd6e9Brian Carlstrom } finally { 109e2f58c9501eac730d048199906dc41fe8e4cd6e9Brian Carlstrom super.finalize(); 110e2f58c9501eac730d048199906dc41fe8e4cd6e9Brian Carlstrom } 111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public Object getOption(int optID) throws SocketException { 1143db0d1b07a79c3c871b0aa0929674adae3081b4fElliott Hughes return Platform.NETWORK.getSocketOption(fd, optID); 115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public int getTimeToLive() throws IOException { 11958e5a8e6eeaf94d78522e0e9994c4565a3b33fdbJesse Wilson return (Integer) getOption(IP_MULTICAST_TTL); 120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public byte getTTL() throws IOException { 1244401c75ac7d85da33472d0398d8166df6ce4beb5Elliott Hughes return (byte) getTimeToLive(); 125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void join(InetAddress addr) throws IOException { 1290b29a1fecc601de2f642ded891726ac3e460d74bElliott Hughes setOption(MCAST_JOIN_GROUP, new MulticastGroupRequest(addr, null)); 130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void joinGroup(SocketAddress addr, NetworkInterface netInterface) throws IOException { 134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (addr instanceof InetSocketAddress) { 135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project InetAddress groupAddr = ((InetSocketAddress) addr).getAddress(); 1360b29a1fecc601de2f642ded891726ac3e460d74bElliott Hughes setOption(MCAST_JOIN_GROUP, new MulticastGroupRequest(groupAddr, netInterface)); 137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void leave(InetAddress addr) throws IOException { 1420b29a1fecc601de2f642ded891726ac3e460d74bElliott Hughes setOption(MCAST_LEAVE_GROUP, new MulticastGroupRequest(addr, null)); 143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 1460b29a1fecc601de2f642ded891726ac3e460d74bElliott Hughes public void leaveGroup(SocketAddress addr, NetworkInterface netInterface) throws IOException { 147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (addr instanceof InetSocketAddress) { 148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project InetAddress groupAddr = ((InetSocketAddress) addr).getAddress(); 1490b29a1fecc601de2f642ded891726ac3e460d74bElliott Hughes setOption(MCAST_LEAVE_GROUP, new MulticastGroupRequest(groupAddr, netInterface)); 150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project protected int peek(InetAddress sender) throws IOException { 155753dcd862b31e85766225590d90ba0b9f481176fElliott Hughes // We don't actually want the data: we just want the DatagramPacket's filled-in address. 156693eacca9fa67ad79d1b35dbaad61c5ac1ac457cElliott Hughes DatagramPacket packet = new DatagramPacket(EmptyArray.BYTE, 0); 157753dcd862b31e85766225590d90ba0b9f481176fElliott Hughes int result = peekData(packet); 1583db0d1b07a79c3c871b0aa0929674adae3081b4fElliott Hughes Platform.NETWORK.setInetAddress(sender, packet.getAddress().getAddress()); 159753dcd862b31e85766225590d90ba0b9f481176fElliott Hughes return result; 160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 16279ff4e73fd689dae6667a8137ee57137962ff13aElliott Hughes private void doRecv(DatagramPacket pack, boolean peek) throws IOException { 1633db0d1b07a79c3c871b0aa0929674adae3081b4fElliott Hughes Platform.NETWORK.recv(fd, pack, pack.getData(), pack.getOffset(), pack.getLength(), peek, 1649f2b1b1c3bf9de560f29f257c855c7c85b405c0fElliott Hughes isNativeConnected); 1659f2b1b1c3bf9de560f29f257c855c7c85b405c0fElliott Hughes if (isNativeConnected) { 1669f2b1b1c3bf9de560f29f257c855c7c85b405c0fElliott Hughes updatePacketRecvAddress(pack); 167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 17179ff4e73fd689dae6667a8137ee57137962ff13aElliott Hughes public void receive(DatagramPacket pack) throws IOException { 17279ff4e73fd689dae6667a8137ee57137962ff13aElliott Hughes doRecv(pack, false); 17379ff4e73fd689dae6667a8137ee57137962ff13aElliott Hughes } 17479ff4e73fd689dae6667a8137ee57137962ff13aElliott Hughes 17579ff4e73fd689dae6667a8137ee57137962ff13aElliott Hughes @Override 17679ff4e73fd689dae6667a8137ee57137962ff13aElliott Hughes public int peekData(DatagramPacket pack) throws IOException { 17779ff4e73fd689dae6667a8137ee57137962ff13aElliott Hughes doRecv(pack, true); 17879ff4e73fd689dae6667a8137ee57137962ff13aElliott Hughes return pack.getPort(); 17979ff4e73fd689dae6667a8137ee57137962ff13aElliott Hughes } 18079ff4e73fd689dae6667a8137ee57137962ff13aElliott Hughes 18179ff4e73fd689dae6667a8137ee57137962ff13aElliott Hughes @Override 182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void send(DatagramPacket packet) throws IOException { 183221d0ccb4cc23ee0bf0646e9abe471fb48b3a1a8Elliott Hughes int port = isNativeConnected ? 0 : packet.getPort(); 184221d0ccb4cc23ee0bf0646e9abe471fb48b3a1a8Elliott Hughes InetAddress address = isNativeConnected ? null : packet.getAddress(); 185f7aab022dcbfcd8f27b409ab92b4bca4a84d0b8aBrian Carlstrom Platform.NETWORK.send(fd, packet.getData(), packet.getOffset(), packet.getLength(), 186f7aab022dcbfcd8f27b409ab92b4bca4a84d0b8aBrian Carlstrom port, address); 187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void setOption(int optID, Object val) throws SocketException { 1903db0d1b07a79c3c871b0aa0929674adae3081b4fElliott Hughes Platform.NETWORK.setSocketOption(fd, optID, val); 191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 194fdd13e86ec613e46b68376f90d2c89c2ac33b4b5Elliott Hughes public void setTimeToLive(int ttl) throws IOException { 195a9a57f2581773484d13e160fd3407692e825971aElliott Hughes setOption(IP_MULTICAST_TTL, Integer.valueOf(ttl)); 196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 199fdd13e86ec613e46b68376f90d2c89c2ac33b4b5Elliott Hughes public void setTTL(byte ttl) throws IOException { 2004d8e9333e494ceedff074def3b6e44f523f3830eElliott Hughes setTimeToLive((int) ttl & 0xff); // Avoid sign extension. 201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void connect(InetAddress inetAddr, int port) throws SocketException { 2053db0d1b07a79c3c871b0aa0929674adae3081b4fElliott Hughes Platform.NETWORK.connect(fd, inetAddr, port, 0); 206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // if we get here then we are connected at the native level 208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project connectedAddress = InetAddress.getByAddress(inetAddr.getAddress()); 210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (UnknownHostException e) { 211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // this is never expected to happen as we should not have gotten 212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // here if the address is not resolvable 213b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes throw new SocketException("Host is unresolved: " + inetAddr.getHostName()); 214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project connectedPort = port; 216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project isNativeConnected = true; 217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void disconnect() { 221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 2223db0d1b07a79c3c871b0aa0929674adae3081b4fElliott Hughes Platform.NETWORK.disconnectDatagram(fd); 22358e5a8e6eeaf94d78522e0e9994c4565a3b33fdbJesse Wilson } catch (Exception ignored) { 224adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project connectedPort = -1; 226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project connectedAddress = null; 227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project isNativeConnected = false; 228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Set the received address and port in the packet. We do this when the 232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Datagram socket is connected at the native level and the 233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * recvConnnectedDatagramImpl does not update the packet with address from 234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * which the packet was received 235f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param packet 237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the packet to be updated 238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private void updatePacketRecvAddress(DatagramPacket packet) { 240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project packet.setAddress(connectedAddress); 241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project packet.setPort(connectedPort); 242adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 244