PlainDatagramSocketImpl.java revision 438cb9e440d250c8aa5daf4fae0c400dce8b1499
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; 27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.net.NetworkInterface; 28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.net.SocketAddress; 29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.net.SocketException; 30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.net.UnknownHostException; 31454a95f6a28855aa3c88d168b15a45bf315efc99Elliott Hughesimport libcore.io.IoUtils; 32438cb9e440d250c8aa5daf4fae0c400dce8b1499Elliott Hughesimport libcore.io.StructGroupReq; 336186821cb13f4ac7ff50950c813394367e021eaeJesse Wilsonimport libcore.util.EmptyArray; 34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.apache.harmony.luni.platform.Platform; 35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/** 378de7cf6bff36093dda9e25a1ab3718720cb54906Elliott Hughes * @hide used in java.nio. 38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 39f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilsonpublic class PlainDatagramSocketImpl extends DatagramSocketImpl { 40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private volatile boolean isNativeConnected; 42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 4312f2d8e2760b78c673b7a187b9062b3938a03147Brian Carlstrom private final CloseGuard guard = CloseGuard.get(); 44f7aab022dcbfcd8f27b409ab92b4bca4a84d0b8aBrian Carlstrom 45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * used to keep address to which the socket was connected to at the native 47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * level 48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private InetAddress connectedAddress; 50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private int connectedPort = -1; 52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public PlainDatagramSocketImpl(FileDescriptor fd, int localPort) { 54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.fd = fd; 55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.localPort = localPort; 56f7aab022dcbfcd8f27b409ab92b4bca4a84d0b8aBrian Carlstrom if (fd.valid()) { 57f7aab022dcbfcd8f27b409ab92b4bca4a84d0b8aBrian Carlstrom guard.open("close"); 58f7aab022dcbfcd8f27b409ab92b4bca4a84d0b8aBrian Carlstrom } 59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public PlainDatagramSocketImpl() { 62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fd = new FileDescriptor(); 63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void bind(int port, InetAddress addr) throws SocketException { 673db0d1b07a79c3c871b0aa0929674adae3081b4fElliott Hughes Platform.NETWORK.bind(fd, addr, port); 683db0d1b07a79c3c871b0aa0929674adae3081b4fElliott Hughes if (port != 0) { 69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project localPort = port; 70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else { 710a9d1ee45a9884a9616624d747172e18734e8fe0Elliott Hughes localPort = IoUtils.getSocketLocalPort(fd); 72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 750a9d1ee45a9884a9616624d747172e18734e8fe0Elliott Hughes setOption(SocketOptions.SO_BROADCAST, Boolean.TRUE); 7658e5a8e6eeaf94d78522e0e9994c4565a3b33fdbJesse Wilson } catch (IOException ignored) { 77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 81c6e0981e5a2d23a0758ed71a8086c4278a7832efJesse Wilson public synchronized void close() { 82f7aab022dcbfcd8f27b409ab92b4bca4a84d0b8aBrian Carlstrom guard.close(); 83c6e0981e5a2d23a0758ed71a8086c4278a7832efJesse Wilson try { 84c6e0981e5a2d23a0758ed71a8086c4278a7832efJesse Wilson Platform.NETWORK.close(fd); 85c6e0981e5a2d23a0758ed71a8086c4278a7832efJesse 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 90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void create() throws SocketException { 91454a95f6a28855aa3c88d168b15a45bf315efc99Elliott Hughes this.fd = IoUtils.socket(false); 92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 94e2f58c9501eac730d048199906dc41fe8e4cd6e9Brian Carlstrom @Override protected void finalize() throws Throwable { 95e2f58c9501eac730d048199906dc41fe8e4cd6e9Brian Carlstrom try { 9612f2d8e2760b78c673b7a187b9062b3938a03147Brian Carlstrom if (guard != null) { 9712f2d8e2760b78c673b7a187b9062b3938a03147Brian Carlstrom guard.warnIfOpen(); 9812f2d8e2760b78c673b7a187b9062b3938a03147Brian Carlstrom } 9912f2d8e2760b78c673b7a187b9062b3938a03147Brian Carlstrom close(); 100e2f58c9501eac730d048199906dc41fe8e4cd6e9Brian Carlstrom } finally { 101e2f58c9501eac730d048199906dc41fe8e4cd6e9Brian Carlstrom super.finalize(); 102e2f58c9501eac730d048199906dc41fe8e4cd6e9Brian Carlstrom } 103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1050a9d1ee45a9884a9616624d747172e18734e8fe0Elliott Hughes @Override public Object getOption(int option) throws SocketException { 1060a9d1ee45a9884a9616624d747172e18734e8fe0Elliott Hughes return IoUtils.getSocketOption(fd, option); 107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public int getTimeToLive() throws IOException { 111c63f0d4e80a9fd3bdf99cd438d108b750226736aElliott Hughes return (Integer) getOption(IoUtils.JAVA_IP_MULTICAST_TTL); 112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public byte getTTL() throws IOException { 1164401c75ac7d85da33472d0398d8166df6ce4beb5Elliott Hughes return (byte) getTimeToLive(); 117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 119438cb9e440d250c8aa5daf4fae0c400dce8b1499Elliott Hughes private static StructGroupReq makeGroupReq(InetAddress gr_group, NetworkInterface networkInterface) { 120438cb9e440d250c8aa5daf4fae0c400dce8b1499Elliott Hughes int gr_interface = (networkInterface != null) ? networkInterface.getIndex() : 0; 121438cb9e440d250c8aa5daf4fae0c400dce8b1499Elliott Hughes return new StructGroupReq(gr_interface, gr_group); 122438cb9e440d250c8aa5daf4fae0c400dce8b1499Elliott Hughes } 123438cb9e440d250c8aa5daf4fae0c400dce8b1499Elliott Hughes 124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void join(InetAddress addr) throws IOException { 126438cb9e440d250c8aa5daf4fae0c400dce8b1499Elliott Hughes setOption(IoUtils.JAVA_MCAST_JOIN_GROUP, makeGroupReq(addr, null)); 127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void joinGroup(SocketAddress addr, NetworkInterface netInterface) throws IOException { 131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (addr instanceof InetSocketAddress) { 132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project InetAddress groupAddr = ((InetSocketAddress) addr).getAddress(); 133438cb9e440d250c8aa5daf4fae0c400dce8b1499Elliott Hughes setOption(IoUtils.JAVA_MCAST_JOIN_GROUP, makeGroupReq(groupAddr, netInterface)); 134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void leave(InetAddress addr) throws IOException { 139438cb9e440d250c8aa5daf4fae0c400dce8b1499Elliott Hughes setOption(IoUtils.JAVA_MCAST_LEAVE_GROUP, makeGroupReq(addr, null)); 140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 1430b29a1fecc601de2f642ded891726ac3e460d74bElliott Hughes public void leaveGroup(SocketAddress addr, NetworkInterface netInterface) throws IOException { 144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (addr instanceof InetSocketAddress) { 145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project InetAddress groupAddr = ((InetSocketAddress) addr).getAddress(); 146438cb9e440d250c8aa5daf4fae0c400dce8b1499Elliott Hughes setOption(IoUtils.JAVA_MCAST_LEAVE_GROUP, makeGroupReq(groupAddr, netInterface)); 147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project protected int peek(InetAddress sender) throws IOException { 152753dcd862b31e85766225590d90ba0b9f481176fElliott Hughes // We don't actually want the data: we just want the DatagramPacket's filled-in address. 153693eacca9fa67ad79d1b35dbaad61c5ac1ac457cElliott Hughes DatagramPacket packet = new DatagramPacket(EmptyArray.BYTE, 0); 154753dcd862b31e85766225590d90ba0b9f481176fElliott Hughes int result = peekData(packet); 1552f03ccad590827233fcba84a8b6eafcd414e5fe7Elliott Hughes // TODO: maybe recv should do this? 1562f03ccad590827233fcba84a8b6eafcd414e5fe7Elliott Hughes sender.ipaddress = packet.getAddress().getAddress(); 157753dcd862b31e85766225590d90ba0b9f481176fElliott Hughes return result; 158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 16079ff4e73fd689dae6667a8137ee57137962ff13aElliott Hughes private void doRecv(DatagramPacket pack, boolean peek) throws IOException { 1613db0d1b07a79c3c871b0aa0929674adae3081b4fElliott Hughes Platform.NETWORK.recv(fd, pack, pack.getData(), pack.getOffset(), pack.getLength(), peek, 1629f2b1b1c3bf9de560f29f257c855c7c85b405c0fElliott Hughes isNativeConnected); 1639f2b1b1c3bf9de560f29f257c855c7c85b405c0fElliott Hughes if (isNativeConnected) { 1649f2b1b1c3bf9de560f29f257c855c7c85b405c0fElliott Hughes updatePacketRecvAddress(pack); 165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 16979ff4e73fd689dae6667a8137ee57137962ff13aElliott Hughes public void receive(DatagramPacket pack) throws IOException { 17079ff4e73fd689dae6667a8137ee57137962ff13aElliott Hughes doRecv(pack, false); 17179ff4e73fd689dae6667a8137ee57137962ff13aElliott Hughes } 17279ff4e73fd689dae6667a8137ee57137962ff13aElliott Hughes 17379ff4e73fd689dae6667a8137ee57137962ff13aElliott Hughes @Override 17479ff4e73fd689dae6667a8137ee57137962ff13aElliott Hughes public int peekData(DatagramPacket pack) throws IOException { 17579ff4e73fd689dae6667a8137ee57137962ff13aElliott Hughes doRecv(pack, true); 17679ff4e73fd689dae6667a8137ee57137962ff13aElliott Hughes return pack.getPort(); 17779ff4e73fd689dae6667a8137ee57137962ff13aElliott Hughes } 17879ff4e73fd689dae6667a8137ee57137962ff13aElliott Hughes 17979ff4e73fd689dae6667a8137ee57137962ff13aElliott Hughes @Override 180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void send(DatagramPacket packet) throws IOException { 181221d0ccb4cc23ee0bf0646e9abe471fb48b3a1a8Elliott Hughes int port = isNativeConnected ? 0 : packet.getPort(); 182221d0ccb4cc23ee0bf0646e9abe471fb48b3a1a8Elliott Hughes InetAddress address = isNativeConnected ? null : packet.getAddress(); 183f7aab022dcbfcd8f27b409ab92b4bca4a84d0b8aBrian Carlstrom Platform.NETWORK.send(fd, packet.getData(), packet.getOffset(), packet.getLength(), 184f7aab022dcbfcd8f27b409ab92b4bca4a84d0b8aBrian Carlstrom port, address); 185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 187c63f0d4e80a9fd3bdf99cd438d108b750226736aElliott Hughes public void setOption(int option, Object value) throws SocketException { 188c63f0d4e80a9fd3bdf99cd438d108b750226736aElliott Hughes IoUtils.setSocketOption(fd, option, value); 189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 192fdd13e86ec613e46b68376f90d2c89c2ac33b4b5Elliott Hughes public void setTimeToLive(int ttl) throws IOException { 193c63f0d4e80a9fd3bdf99cd438d108b750226736aElliott Hughes setOption(IoUtils.JAVA_IP_MULTICAST_TTL, Integer.valueOf(ttl)); 194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 197fdd13e86ec613e46b68376f90d2c89c2ac33b4b5Elliott Hughes public void setTTL(byte ttl) throws IOException { 1984d8e9333e494ceedff074def3b6e44f523f3830eElliott Hughes setTimeToLive((int) ttl & 0xff); // Avoid sign extension. 199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void connect(InetAddress inetAddr, int port) throws SocketException { 2033db0d1b07a79c3c871b0aa0929674adae3081b4fElliott Hughes Platform.NETWORK.connect(fd, inetAddr, port, 0); 204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // if we get here then we are connected at the native level 206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project connectedAddress = InetAddress.getByAddress(inetAddr.getAddress()); 208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (UnknownHostException e) { 209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // this is never expected to happen as we should not have gotten 210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // here if the address is not resolvable 211b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes throw new SocketException("Host is unresolved: " + inetAddr.getHostName()); 212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project connectedPort = port; 214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project isNativeConnected = true; 215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void disconnect() { 219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 2203db0d1b07a79c3c871b0aa0929674adae3081b4fElliott Hughes Platform.NETWORK.disconnectDatagram(fd); 22158e5a8e6eeaf94d78522e0e9994c4565a3b33fdbJesse Wilson } catch (Exception ignored) { 222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project connectedPort = -1; 224adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project connectedAddress = null; 225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project isNativeConnected = false; 226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Set the received address and port in the packet. We do this when the 230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Datagram socket is connected at the native level and the 231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * recvConnnectedDatagramImpl does not update the packet with address from 232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * which the packet was received 233f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param packet 235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the packet to be updated 236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private void updatePacketRecvAddress(DatagramPacket packet) { 238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project packet.setAddress(connectedAddress); 239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project packet.setPort(connectedPort); 240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 242