PlainDatagramSocketImpl.java revision 12f2d8e2760b78c673b7a187b9062b3938a03147
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
20f7aab022dcbfcd8f27b409ab92b4bca4a84d0b8aBrian Carlstromimport dalvik.system.CloseGuard;
21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.FileDescriptor;
22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.IOException;
23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.net.DatagramPacket;
24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.net.DatagramSocketImpl;
25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.net.InetAddress;
26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.net.InetSocketAddress;
270b29a1fecc601de2f642ded891726ac3e460d74bElliott Hughesimport java.net.MulticastGroupRequest;
28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.net.NetworkInterface;
29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.net.SocketAddress;
30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.net.SocketException;
31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.net.UnknownHostException;
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
46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    final static int IP_MULTICAST_TTL = 17;
47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private volatile boolean isNativeConnected;
49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
5012f2d8e2760b78c673b7a187b9062b3938a03147Brian Carlstrom    private final CloseGuard guard = CloseGuard.get();
51f7aab022dcbfcd8f27b409ab92b4bca4a84d0b8aBrian Carlstrom
52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * used to keep address to which the socket was connected to at the native
54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * level
55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private InetAddress connectedAddress;
57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private int connectedPort = -1;
59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public PlainDatagramSocketImpl(FileDescriptor fd, int localPort) {
61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        super();
62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.fd = fd;
63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.localPort = localPort;
64f7aab022dcbfcd8f27b409ab92b4bca4a84d0b8aBrian Carlstrom        if (fd.valid()) {
65f7aab022dcbfcd8f27b409ab92b4bca4a84d0b8aBrian Carlstrom            guard.open("close");
66f7aab022dcbfcd8f27b409ab92b4bca4a84d0b8aBrian Carlstrom        }
67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public PlainDatagramSocketImpl() {
70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        super();
71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        fd = new FileDescriptor();
72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void bind(int port, InetAddress addr) throws SocketException {
763db0d1b07a79c3c871b0aa0929674adae3081b4fElliott Hughes        Platform.NETWORK.bind(fd, addr, port);
773db0d1b07a79c3c871b0aa0929674adae3081b4fElliott Hughes        if (port != 0) {
78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            localPort = port;
79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } else {
803db0d1b07a79c3c871b0aa0929674adae3081b4fElliott Hughes            localPort = Platform.NETWORK.getSocketLocalPort(fd);
81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            setOption(SO_BROADCAST, Boolean.TRUE);
8558e5a8e6eeaf94d78522e0e9994c4565a3b33fdbJesse Wilson        } catch (IOException ignored) {
86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
90c6e0981e5a2d23a0758ed71a8086c4278a7832efJesse Wilson    public synchronized void close() {
91f7aab022dcbfcd8f27b409ab92b4bca4a84d0b8aBrian Carlstrom        guard.close();
92c6e0981e5a2d23a0758ed71a8086c4278a7832efJesse Wilson        try {
93c6e0981e5a2d23a0758ed71a8086c4278a7832efJesse Wilson            Platform.NETWORK.close(fd);
94c6e0981e5a2d23a0758ed71a8086c4278a7832efJesse Wilson        } catch (IOException ignored) {
95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void create() throws SocketException {
1003db0d1b07a79c3c871b0aa0929674adae3081b4fElliott Hughes        Platform.NETWORK.socket(fd, false);
101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
103e2f58c9501eac730d048199906dc41fe8e4cd6e9Brian Carlstrom    @Override protected void finalize() throws Throwable {
104e2f58c9501eac730d048199906dc41fe8e4cd6e9Brian Carlstrom        try {
10512f2d8e2760b78c673b7a187b9062b3938a03147Brian Carlstrom            if (guard != null) {
10612f2d8e2760b78c673b7a187b9062b3938a03147Brian Carlstrom                guard.warnIfOpen();
10712f2d8e2760b78c673b7a187b9062b3938a03147Brian Carlstrom            }
10812f2d8e2760b78c673b7a187b9062b3938a03147Brian Carlstrom            close();
109e2f58c9501eac730d048199906dc41fe8e4cd6e9Brian Carlstrom        } finally {
110e2f58c9501eac730d048199906dc41fe8e4cd6e9Brian Carlstrom            super.finalize();
111e2f58c9501eac730d048199906dc41fe8e4cd6e9Brian Carlstrom        }
112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Object getOption(int optID) throws SocketException {
1153db0d1b07a79c3c871b0aa0929674adae3081b4fElliott Hughes        return Platform.NETWORK.getSocketOption(fd, optID);
116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int getTimeToLive() throws IOException {
12058e5a8e6eeaf94d78522e0e9994c4565a3b33fdbJesse Wilson        return (Integer) getOption(IP_MULTICAST_TTL);
121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public byte getTTL() throws IOException {
1254401c75ac7d85da33472d0398d8166df6ce4beb5Elliott Hughes        return (byte) getTimeToLive();
126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void join(InetAddress addr) throws IOException {
1300b29a1fecc601de2f642ded891726ac3e460d74bElliott Hughes        setOption(MCAST_JOIN_GROUP, new MulticastGroupRequest(addr, null));
131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void joinGroup(SocketAddress addr, NetworkInterface netInterface) throws IOException {
135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (addr instanceof InetSocketAddress) {
136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            InetAddress groupAddr = ((InetSocketAddress) addr).getAddress();
1370b29a1fecc601de2f642ded891726ac3e460d74bElliott Hughes            setOption(MCAST_JOIN_GROUP, new MulticastGroupRequest(groupAddr, netInterface));
138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void leave(InetAddress addr) throws IOException {
1430b29a1fecc601de2f642ded891726ac3e460d74bElliott Hughes        setOption(MCAST_LEAVE_GROUP, new MulticastGroupRequest(addr, null));
144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
1470b29a1fecc601de2f642ded891726ac3e460d74bElliott Hughes    public void leaveGroup(SocketAddress addr, NetworkInterface netInterface) throws IOException {
148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (addr instanceof InetSocketAddress) {
149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            InetAddress groupAddr = ((InetSocketAddress) addr).getAddress();
1500b29a1fecc601de2f642ded891726ac3e460d74bElliott Hughes            setOption(MCAST_LEAVE_GROUP, new MulticastGroupRequest(groupAddr, netInterface));
151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected int peek(InetAddress sender) throws IOException {
156753dcd862b31e85766225590d90ba0b9f481176fElliott Hughes        // We don't actually want the data: we just want the DatagramPacket's filled-in address.
157753dcd862b31e85766225590d90ba0b9f481176fElliott Hughes        byte[] bytes = new byte[0];
158753dcd862b31e85766225590d90ba0b9f481176fElliott Hughes        DatagramPacket packet = new DatagramPacket(bytes, bytes.length);
159753dcd862b31e85766225590d90ba0b9f481176fElliott Hughes        int result = peekData(packet);
1603db0d1b07a79c3c871b0aa0929674adae3081b4fElliott Hughes        Platform.NETWORK.setInetAddress(sender, packet.getAddress().getAddress());
161753dcd862b31e85766225590d90ba0b9f481176fElliott Hughes        return result;
162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
16479ff4e73fd689dae6667a8137ee57137962ff13aElliott Hughes    private void doRecv(DatagramPacket pack, boolean peek) throws IOException {
1653db0d1b07a79c3c871b0aa0929674adae3081b4fElliott Hughes        Platform.NETWORK.recv(fd, pack, pack.getData(), pack.getOffset(), pack.getLength(), peek,
1669f2b1b1c3bf9de560f29f257c855c7c85b405c0fElliott Hughes                isNativeConnected);
1679f2b1b1c3bf9de560f29f257c855c7c85b405c0fElliott Hughes        if (isNativeConnected) {
1689f2b1b1c3bf9de560f29f257c855c7c85b405c0fElliott Hughes            updatePacketRecvAddress(pack);
169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
17379ff4e73fd689dae6667a8137ee57137962ff13aElliott Hughes    public void receive(DatagramPacket pack) throws IOException {
17479ff4e73fd689dae6667a8137ee57137962ff13aElliott Hughes        doRecv(pack, false);
17579ff4e73fd689dae6667a8137ee57137962ff13aElliott Hughes    }
17679ff4e73fd689dae6667a8137ee57137962ff13aElliott Hughes
17779ff4e73fd689dae6667a8137ee57137962ff13aElliott Hughes    @Override
17879ff4e73fd689dae6667a8137ee57137962ff13aElliott Hughes    public int peekData(DatagramPacket pack) throws IOException {
17979ff4e73fd689dae6667a8137ee57137962ff13aElliott Hughes        doRecv(pack, true);
18079ff4e73fd689dae6667a8137ee57137962ff13aElliott Hughes        return pack.getPort();
18179ff4e73fd689dae6667a8137ee57137962ff13aElliott Hughes    }
18279ff4e73fd689dae6667a8137ee57137962ff13aElliott Hughes
18379ff4e73fd689dae6667a8137ee57137962ff13aElliott Hughes    @Override
184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void send(DatagramPacket packet) throws IOException {
185221d0ccb4cc23ee0bf0646e9abe471fb48b3a1a8Elliott Hughes        int port = isNativeConnected ? 0 : packet.getPort();
186221d0ccb4cc23ee0bf0646e9abe471fb48b3a1a8Elliott Hughes        InetAddress address = isNativeConnected ? null : packet.getAddress();
187f7aab022dcbfcd8f27b409ab92b4bca4a84d0b8aBrian Carlstrom        Platform.NETWORK.send(fd, packet.getData(), packet.getOffset(), packet.getLength(),
188f7aab022dcbfcd8f27b409ab92b4bca4a84d0b8aBrian Carlstrom                              port, address);
189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setOption(int optID, Object val) throws SocketException {
1923db0d1b07a79c3c871b0aa0929674adae3081b4fElliott Hughes        Platform.NETWORK.setSocketOption(fd, optID, val);
193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
196fdd13e86ec613e46b68376f90d2c89c2ac33b4b5Elliott Hughes    public void setTimeToLive(int ttl) throws IOException {
197a9a57f2581773484d13e160fd3407692e825971aElliott Hughes        setOption(IP_MULTICAST_TTL, Integer.valueOf(ttl));
198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
201fdd13e86ec613e46b68376f90d2c89c2ac33b4b5Elliott Hughes    public void setTTL(byte ttl) throws IOException {
2024d8e9333e494ceedff074def3b6e44f523f3830eElliott Hughes        setTimeToLive((int) ttl & 0xff); // Avoid sign extension.
203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void connect(InetAddress inetAddr, int port) throws SocketException {
2073db0d1b07a79c3c871b0aa0929674adae3081b4fElliott Hughes        Platform.NETWORK.connect(fd, inetAddr, port, 0);
208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // if we get here then we are connected at the native level
210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            connectedAddress = InetAddress.getByAddress(inetAddr.getAddress());
212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (UnknownHostException e) {
213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // this is never expected to happen as we should not have gotten
214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // here if the address is not resolvable
215b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes            throw new SocketException("Host is unresolved: " + inetAddr.getHostName());
216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        connectedPort = port;
218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        isNativeConnected = true;
219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void disconnect() {
223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
2243db0d1b07a79c3c871b0aa0929674adae3081b4fElliott Hughes            Platform.NETWORK.disconnectDatagram(fd);
22558e5a8e6eeaf94d78522e0e9994c4565a3b33fdbJesse Wilson        } catch (Exception ignored) {
226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        connectedPort = -1;
228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        connectedAddress = null;
229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        isNativeConnected = false;
230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Set the received address and port in the packet. We do this when the
234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Datagram socket is connected at the native level and the
235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * recvConnnectedDatagramImpl does not update the packet with address from
236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * which the packet was received
237f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param packet
239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the packet to be updated
240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private void updatePacketRecvAddress(DatagramPacket packet) {
242adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        packet.setAddress(connectedAddress);
243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        packet.setPort(connectedPort);
244adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
245adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
246