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