PlainDatagramSocketImpl.java revision 0b29a1fecc601de2f642ded891726ac3e460d74b
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 20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.FileDescriptor; 21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.IOException; 22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.net.DatagramPacket; 23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.net.DatagramSocketImpl; 24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.net.InetAddress; 25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.net.InetSocketAddress; 260b29a1fecc601de2f642ded891726ac3e460d74bElliott Hughesimport java.net.MulticastGroupRequest; 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; 31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.apache.harmony.luni.platform.INetworkSystem; 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 46f3afb1b6a4ace33bd60e5801bdb2fcb2e935d486Elliott Hughes static final int TCP_NODELAY = 4; 47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project final static int IP_MULTICAST_TTL = 17; 49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private byte[] ipaddress = { 0, 0, 0, 0 }; 51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private INetworkSystem netImpl = Platform.getNetworkSystem(); 53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private volatile boolean isNativeConnected; 55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 567738141c52b931e103efe7ad62d32a12785bf6b1Elliott Hughes private boolean streaming = true; 57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 587738141c52b931e103efe7ad62d32a12785bf6b1Elliott Hughes private boolean shutdownInput; 59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * used to keep address to which the socket was connected to at the native 62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * level 63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private InetAddress connectedAddress; 65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private int connectedPort = -1; 67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public PlainDatagramSocketImpl(FileDescriptor fd, int localPort) { 69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project super(); 70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.fd = fd; 71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.localPort = localPort; 72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public PlainDatagramSocketImpl() { 75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project super(); 76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fd = new FileDescriptor(); 77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void bind(int port, InetAddress addr) throws SocketException { 81f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson netImpl.bind(fd, addr, port); 82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (0 != port) { 83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project localPort = port; 84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else { 854c5cbf2953ada194c4dc9d7b387615b1c6fe3e63Elliott Hughes localPort = netImpl.getSocketLocalPort(fd); 86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Ignore failures 90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project setOption(SO_BROADCAST, Boolean.TRUE); 91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (IOException e) { 92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void close() { 97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project synchronized (fd) { 98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (fd.valid()) { 99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 10079ff4e73fd689dae6667a8137ee57137962ff13aElliott Hughes netImpl.close(fd); 101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (IOException e) { 102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fd = new FileDescriptor(); 104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void create() throws SocketException { 110a92f883cda9e483c64f78dbba0031e6e43cd00abElliott Hughes netImpl.socket(fd, false); 111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project protected void finalize() { 115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project close(); 116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public Object getOption(int optID) throws SocketException { 1192cd82d7111f68ff63145ef7c393bf1479ff06223Elliott Hughes return netImpl.getSocketOption(fd, optID); 120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public int getTimeToLive() throws IOException { 1244401c75ac7d85da33472d0398d8166df6ce4beb5Elliott Hughes return ((Integer) getOption(IP_MULTICAST_TTL)).intValue(); 125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public byte getTTL() throws IOException { 1294401c75ac7d85da33472d0398d8166df6ce4beb5Elliott Hughes return (byte) getTimeToLive(); 130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void join(InetAddress addr) throws IOException { 1340b29a1fecc601de2f642ded891726ac3e460d74bElliott Hughes setOption(MCAST_JOIN_GROUP, new MulticastGroupRequest(addr, null)); 135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void joinGroup(SocketAddress addr, NetworkInterface netInterface) throws IOException { 139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (addr instanceof InetSocketAddress) { 140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project InetAddress groupAddr = ((InetSocketAddress) addr).getAddress(); 1410b29a1fecc601de2f642ded891726ac3e460d74bElliott Hughes setOption(MCAST_JOIN_GROUP, new MulticastGroupRequest(groupAddr, netInterface)); 142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void leave(InetAddress addr) throws IOException { 1470b29a1fecc601de2f642ded891726ac3e460d74bElliott Hughes setOption(MCAST_LEAVE_GROUP, new MulticastGroupRequest(addr, null)); 148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 1510b29a1fecc601de2f642ded891726ac3e460d74bElliott Hughes public void leaveGroup(SocketAddress addr, NetworkInterface netInterface) throws IOException { 152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (addr instanceof InetSocketAddress) { 153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project InetAddress groupAddr = ((InetSocketAddress) addr).getAddress(); 1540b29a1fecc601de2f642ded891726ac3e460d74bElliott Hughes setOption(MCAST_LEAVE_GROUP, new MulticastGroupRequest(groupAddr, netInterface)); 155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project protected int peek(InetAddress sender) throws IOException { 160753dcd862b31e85766225590d90ba0b9f481176fElliott Hughes // We don't actually want the data: we just want the DatagramPacket's filled-in address. 161753dcd862b31e85766225590d90ba0b9f481176fElliott Hughes byte[] bytes = new byte[0]; 162753dcd862b31e85766225590d90ba0b9f481176fElliott Hughes DatagramPacket packet = new DatagramPacket(bytes, bytes.length); 163753dcd862b31e85766225590d90ba0b9f481176fElliott Hughes int result = peekData(packet); 164753dcd862b31e85766225590d90ba0b9f481176fElliott Hughes netImpl.setInetAddress(sender, packet.getAddress().getAddress()); 165753dcd862b31e85766225590d90ba0b9f481176fElliott Hughes return result; 166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 16879ff4e73fd689dae6667a8137ee57137962ff13aElliott Hughes private void doRecv(DatagramPacket pack, boolean peek) throws IOException { 1699f2b1b1c3bf9de560f29f257c855c7c85b405c0fElliott Hughes netImpl.recv(fd, pack, pack.getData(), pack.getOffset(), pack.getLength(), peek, 1709f2b1b1c3bf9de560f29f257c855c7c85b405c0fElliott Hughes isNativeConnected); 1719f2b1b1c3bf9de560f29f257c855c7c85b405c0fElliott Hughes if (isNativeConnected) { 1729f2b1b1c3bf9de560f29f257c855c7c85b405c0fElliott Hughes updatePacketRecvAddress(pack); 173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 17779ff4e73fd689dae6667a8137ee57137962ff13aElliott Hughes public void receive(DatagramPacket pack) throws IOException { 17879ff4e73fd689dae6667a8137ee57137962ff13aElliott Hughes doRecv(pack, false); 17979ff4e73fd689dae6667a8137ee57137962ff13aElliott Hughes } 18079ff4e73fd689dae6667a8137ee57137962ff13aElliott Hughes 18179ff4e73fd689dae6667a8137ee57137962ff13aElliott Hughes @Override 18279ff4e73fd689dae6667a8137ee57137962ff13aElliott Hughes public int peekData(DatagramPacket pack) throws IOException { 18379ff4e73fd689dae6667a8137ee57137962ff13aElliott Hughes doRecv(pack, true); 18479ff4e73fd689dae6667a8137ee57137962ff13aElliott Hughes return pack.getPort(); 18579ff4e73fd689dae6667a8137ee57137962ff13aElliott Hughes } 18679ff4e73fd689dae6667a8137ee57137962ff13aElliott Hughes 18779ff4e73fd689dae6667a8137ee57137962ff13aElliott Hughes @Override 188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void send(DatagramPacket packet) throws IOException { 189221d0ccb4cc23ee0bf0646e9abe471fb48b3a1a8Elliott Hughes int port = isNativeConnected ? 0 : packet.getPort(); 190221d0ccb4cc23ee0bf0646e9abe471fb48b3a1a8Elliott Hughes InetAddress address = isNativeConnected ? null : packet.getAddress(); 1912cd82d7111f68ff63145ef7c393bf1479ff06223Elliott Hughes netImpl.send(fd, packet.getData(), packet.getOffset(), packet.getLength(), port, address); 192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void setOption(int optID, Object val) throws SocketException { 1952cd82d7111f68ff63145ef7c393bf1479ff06223Elliott Hughes netImpl.setSocketOption(fd, optID, val); 196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 199fdd13e86ec613e46b68376f90d2c89c2ac33b4b5Elliott Hughes public void setTimeToLive(int ttl) throws IOException { 200a9a57f2581773484d13e160fd3407692e825971aElliott Hughes setOption(IP_MULTICAST_TTL, Integer.valueOf(ttl)); 201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 204fdd13e86ec613e46b68376f90d2c89c2ac33b4b5Elliott Hughes public void setTTL(byte ttl) throws IOException { 2054d8e9333e494ceedff074def3b6e44f523f3830eElliott Hughes setTimeToLive((int) ttl & 0xff); // Avoid sign extension. 206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void connect(InetAddress inetAddr, int port) throws SocketException { 210036ffc75d2b7ece42bcd97f290c026e215868ba9Elliott Hughes netImpl.connect(fd, inetAddr, port, 0); 211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // if we get here then we are connected at the native level 213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project connectedAddress = InetAddress.getByAddress(inetAddr.getAddress()); 215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (UnknownHostException e) { 216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // this is never expected to happen as we should not have gotten 217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // here if the address is not resolvable 218b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes throw new SocketException("Host is unresolved: " + inetAddr.getHostName()); 219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project connectedPort = port; 221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project isNativeConnected = true; 222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 224adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void disconnect() { 226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project netImpl.disconnectDatagram(fd); 228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (Exception e) { 229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // there is currently no way to return an error so just eat any 230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // exception 231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project connectedPort = -1; 233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project connectedAddress = null; 234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project isNativeConnected = false; 235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Set the received address and port in the packet. We do this when the 239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Datagram socket is connected at the native level and the 240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * recvConnnectedDatagramImpl does not update the packet with address from 241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * which the packet was received 242f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param packet 244adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the packet to be updated 245adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 246adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private void updatePacketRecvAddress(DatagramPacket packet) { 247adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project packet.setAddress(connectedAddress); 248adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project packet.setPort(connectedPort); 249adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 250adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 251