PlainDatagramSocketImpl.java revision adc854b798c1cfe3bfd4c27d68d5cee38ca617da
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.io.InterruptedIOException; 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.SocketOptions; 31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.net.SocketTimeoutException; 32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.net.UnknownHostException; 33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.AccessController; 34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.apache.harmony.luni.platform.INetworkSystem; 36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.apache.harmony.luni.platform.Platform; 37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.apache.harmony.luni.util.Msg; 38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.apache.harmony.luni.util.PriviAction; 39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/** 41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The default, concrete instance of datagram sockets. This class does not 42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * support security checks. Alternative types of DatagramSocketImpl's may be 43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * used by setting the <code>impl.prefix</code> system property. 44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectclass PlainDatagramSocketImpl extends DatagramSocketImpl { 46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project static final int MULTICAST_IF = 1; 48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project static final int MULTICAST_TTL = 2; 50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project static final int TCP_NODELAY = 4; 52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project static final int FLAG_SHUTDOWN = 8; 54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private final static int SO_BROADCAST = 32; 56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project final static int IP_MULTICAST_ADD = 19; 58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project final static int IP_MULTICAST_DROP = 20; 60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project final static int IP_MULTICAST_TTL = 17; 62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * for datagram and multicast sockets we have to set REUSEADDR and REUSEPORT 65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * when REUSEADDR is set for other types of sockets we need to just set 66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * REUSEADDR therefore we have this other option which sets both if 67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * supported by the platform. this cannot be in SOCKET_OPTIONS because since 68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * it is a public interface it ends up being public even if it is not 69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * declared public 70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project static final int REUSEADDR_AND_REUSEPORT = 10001; 72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private boolean bindToDevice; 74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private byte[] ipaddress = { 0, 0, 0, 0 }; 76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private int ttl = 1; 78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private INetworkSystem netImpl = Platform.getNetworkSystem(); 80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private volatile boolean isNativeConnected; 82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public int receiveTimeout; 84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public boolean streaming = true; 86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public boolean shutdownInput; 88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * used to keep address to which the socket was connected to at the native 91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * level 92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private InetAddress connectedAddress; 94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private int connectedPort = -1; 96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * used to store the trafficClass value which is simply returned as the 99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * value that was set. We also need it to pass it to methods that specify an 100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * address packets are going to be sent to 101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private int trafficClass; 103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public PlainDatagramSocketImpl(FileDescriptor fd, int localPort) { 105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project super(); 106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.fd = fd; 107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.localPort = localPort; 108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public PlainDatagramSocketImpl() { 111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project super(); 112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fd = new FileDescriptor(); 113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void bind(int port, InetAddress addr) throws SocketException { 117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String prop = AccessController.doPrivileged(new PriviAction<String>("bindToDevice")); //$NON-NLS-1$ 118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project boolean useBindToDevice = prop != null && prop.toLowerCase().equals("true"); //$NON-NLS-1$ 119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project bindToDevice = netImpl.bind2(fd, port, useBindToDevice, addr); 120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (0 != port) { 121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project localPort = port; 122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else { 123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project localPort = netImpl.getSocketLocalPort(fd, NetUtil.preferIPv6Addresses()); 124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Ignore failures 128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project setOption(SO_BROADCAST, Boolean.TRUE); 129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (IOException e) { 130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void close() { 135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project synchronized (fd) { 136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (fd.valid()) { 137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project netImpl.socketClose(fd); 139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (IOException e) { 140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fd = new FileDescriptor(); 142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void create() throws SocketException { 148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project netImpl.createDatagramSocket(fd, NetUtil.preferIPv4Stack()); 149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project protected void finalize() { 153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project close(); 154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public Object getOption(int optID) throws SocketException { 158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (optID == SocketOptions.SO_TIMEOUT) { 159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return Integer.valueOf(receiveTimeout); 160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else if (optID == SocketOptions.IP_TOS) { 161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return Integer.valueOf(trafficClass); 162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else { 163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Call the native first so there will be 164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // an exception if the socket if closed. 165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Object result = netImpl.getSocketOption(fd, optID); 166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (optID == SocketOptions.IP_MULTICAST_IF 167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project && (netImpl.getSocketFlags() & MULTICAST_IF) != 0) { 168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return InetAddress.getByAddress(ipaddress); 170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (UnknownHostException e) { 171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return null; 172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return result; 175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public int getTimeToLive() throws IOException { 180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Call the native first so there will be an exception if the socket if 181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // closed. 182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int result = (((Byte) getOption(IP_MULTICAST_TTL)).byteValue()) & 0xFF; 183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if ((netImpl.getSocketFlags() & MULTICAST_TTL) != 0) { 184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return ttl; 185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return result; 187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public byte getTTL() throws IOException { 191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Call the native first so there will be an exception if the socket if 192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // closed. 193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project byte result = ((Byte) getOption(IP_MULTICAST_TTL)).byteValue(); 194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if ((netImpl.getSocketFlags() & MULTICAST_TTL) != 0) { 195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return (byte) ttl; 196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return result; 198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void join(InetAddress addr) throws IOException { 202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project setOption(IP_MULTICAST_ADD, new GenericIPMreq(addr)); 203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void joinGroup(SocketAddress addr, NetworkInterface netInterface) throws IOException { 207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (addr instanceof InetSocketAddress) { 208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project InetAddress groupAddr = ((InetSocketAddress) addr).getAddress(); 209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project setOption(IP_MULTICAST_ADD, new GenericIPMreq(groupAddr, netInterface)); 210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void leave(InetAddress addr) throws IOException { 215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project setOption(IP_MULTICAST_DROP, new GenericIPMreq(addr)); 216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void leaveGroup(SocketAddress addr, NetworkInterface netInterface) 220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throws IOException { 221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (addr instanceof InetSocketAddress) { 222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project InetAddress groupAddr = ((InetSocketAddress) addr).getAddress(); 223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project setOption(IP_MULTICAST_DROP, new GenericIPMreq(groupAddr, netInterface)); 224adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project protected int peek(InetAddress sender) throws IOException { 229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (isNativeConnected) { 230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /* 231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * in this case we know the port and address from which the data 232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * must have be been received as the socket is connected. However, 233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * we still need to do the receive in order to know that there was 234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * data received. We use a short buffer as we don't actually need 235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the packet, only the knowledge that it is there 236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project byte[] storageArray = new byte[10]; 238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project DatagramPacket pack = new DatagramPacket(storageArray, storageArray.length); 239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project netImpl.recvConnectedDatagram(fd, pack, pack.getData(), pack.getOffset(), pack 240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project .getLength(), receiveTimeout, true); // peek 241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // to set the sender ,we now use a native function 242adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // sender.ipaddress = connectedAddress.getAddress(); 243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project netImpl.setInetAddress(sender, connectedAddress.getAddress()); 244adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return connectedPort; 245adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 246adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return netImpl.peekDatagram(fd, sender, receiveTimeout); 247adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 248adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 249adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 250adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void receive(DatagramPacket pack) throws java.io.IOException { 251adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 252adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (isNativeConnected) { 253adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // do not peek 254adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project netImpl.recvConnectedDatagram(fd, pack, pack.getData(), pack.getOffset(), pack 255adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project .getLength(), receiveTimeout, false); 256adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project updatePacketRecvAddress(pack); 257adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else { 258adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // receiveDatagramImpl2 259adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project netImpl.receiveDatagram(fd, pack, pack.getData(), pack.getOffset(), pack 260adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project .getLength(), receiveTimeout, false); 261adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 262adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (InterruptedIOException e) { 263adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new SocketTimeoutException(e.getMessage()); 264adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 265adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 266adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 267adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 268adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void send(DatagramPacket packet) throws IOException { 269adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 270adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (isNativeConnected) { 271adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project netImpl.sendConnectedDatagram(fd, packet.getData(), packet.getOffset(), packet 272adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project .getLength(), bindToDevice); 273adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else { 274adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // sendDatagramImpl2 275adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project netImpl.sendDatagram(fd, packet.getData(), packet.getOffset(), packet.getLength(), 276adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project packet.getPort(), bindToDevice, trafficClass, packet.getAddress()); 277adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 278adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 279adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 280adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 281adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Set the nominated socket option. As the timeouts are not set as options 282adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * in the IP stack, the value is stored in an instance field. 283adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 284adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws SocketException thrown if the option value is unsupported or 285adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * invalid 286adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 287adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 288adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void setOption(int optID, Object val) throws SocketException { 289adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /* 290adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * for datagram sockets on some platforms we have to set both the 291adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * REUSEADDR AND REUSEPORT so for REUSEADDR set this option option which 292adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * tells the VM to set the two values as appropriate for the platform 293adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 294adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (optID == SocketOptions.SO_REUSEADDR) { 295adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project optID = REUSEADDR_AND_REUSEPORT; 296adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 297adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 298adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (optID == SocketOptions.SO_TIMEOUT) { 299adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project receiveTimeout = ((Integer) val).intValue(); 300adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else { 301adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int flags = netImpl.getSocketFlags(); 302adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 303adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project netImpl.setSocketOption(fd, optID | (flags << 16), val); 304adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (SocketException e) { 305adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // we don't throw an exception for IP_TOS even if the platform 306adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // won't let us set the requested value 307adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (optID != SocketOptions.IP_TOS) { 308adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw e; 309adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 310adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 311adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (optID == SocketOptions.IP_MULTICAST_IF && (flags & MULTICAST_IF) != 0) { 312adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project InetAddress inet = (InetAddress) val; 313adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (NetUtil.bytesToInt(inet.getAddress(), 0) == 0 || inet.isLoopbackAddress()) { 314adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ipaddress = ((InetAddress) val).getAddress(); 315adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else { 316adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project InetAddress local = null; 317adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 318adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project local = InetAddress.getLocalHost(); 319adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (UnknownHostException e) { 320adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new SocketException("getLocalHost(): " + e.toString()); 321adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 322adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (inet.equals(local)) { 323adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ipaddress = ((InetAddress) val).getAddress(); 324adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else { 325adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new SocketException(val + " != getLocalHost(): " + local); 326adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 327adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 328adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 329adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /* 330adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * save this value as it is actually used differently for IPv4 and 331adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * IPv6 so we cannot get the value using the getOption. The option 332adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * is actually only set for IPv4 and a masked version of the value 333adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * will be set as only a subset of the values are allowed on the 334adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * socket. Therefore we need to retain it to return the value that 335adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * was set. We also need the value to be passed into a number of 336adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * natives so that it can be used properly with IPv6 337adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 338adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (optID == SocketOptions.IP_TOS) { 339adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project trafficClass = ((Integer) val).intValue(); 340adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 341adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 342adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 343adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 344adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 345adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void setTimeToLive(int ttl) throws java.io.IOException { 346adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project setOption(IP_MULTICAST_TTL, Byte.valueOf((byte) (ttl & 0xFF))); 347adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if ((netImpl.getSocketFlags() & MULTICAST_TTL) != 0) { 348adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.ttl = ttl; 349adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 350adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 351adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 352adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 353adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void setTTL(byte ttl) throws java.io.IOException { 354adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project setOption(IP_MULTICAST_TTL, Byte.valueOf(ttl)); 355adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if ((netImpl.getSocketFlags() & MULTICAST_TTL) != 0) { 356adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.ttl = ttl; 357adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 358adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 359adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 360adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 361adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void connect(InetAddress inetAddr, int port) throws SocketException { 362adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 363adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // connectDatagram impl2 364adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project netImpl.connectDatagram(fd, port, trafficClass, inetAddr); 365adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 366adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // if we get here then we are connected at the native level 367adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 368adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project connectedAddress = InetAddress.getByAddress(inetAddr.getAddress()); 369adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (UnknownHostException e) { 370adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // this is never expected to happen as we should not have gotten 371adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // here if the address is not resolvable 372adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new SocketException(Msg.getString("K0317", inetAddr.getHostName())); //$NON-NLS-1$ 373adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 374adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project connectedPort = port; 375adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project isNativeConnected = true; 376adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 377adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 378adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 379adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void disconnect() { 380adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 381adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project netImpl.disconnectDatagram(fd); 382adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (Exception e) { 383adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // there is currently no way to return an error so just eat any 384adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // exception 385adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 386adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project connectedPort = -1; 387adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project connectedAddress = null; 388adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project isNativeConnected = false; 389adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 390adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 391adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 392adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public int peekData(DatagramPacket pack) throws IOException { 393adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 394adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (isNativeConnected) { 395adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project netImpl.recvConnectedDatagram(fd, pack, pack.getData(), pack.getOffset(), pack 396adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project .getLength(), receiveTimeout, true); // peek 397adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project updatePacketRecvAddress(pack); 398adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else { 399adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // receiveDatagram 2 400adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project netImpl.receiveDatagram(fd, pack, pack.getData(), pack.getOffset(), pack 401adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project .getLength(), receiveTimeout, true); // peek 402adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 403adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (InterruptedIOException e) { 404adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new SocketTimeoutException(e.toString()); 405adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 406adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return pack.getPort(); 407adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 408adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 409adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 410adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Set the received address and port in the packet. We do this when the 411adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Datagram socket is connected at the native level and the 412adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * recvConnnectedDatagramImpl does not update the packet with address from 413adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * which the packet was received 414adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 415adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param packet 416adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the packet to be updated 417adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 418adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private void updatePacketRecvAddress(DatagramPacket packet) { 419adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project packet.setAddress(connectedAddress); 420adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project packet.setPort(connectedPort); 421adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 422adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 423