PlainDatagramSocketImpl.java revision 8de7cf6bff36093dda9e25a1ab3718720cb54906
1adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/*
2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  Licensed to the Apache Software Foundation (ASF) under one or more
3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  contributor license agreements.  See the NOTICE file distributed with
4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  this work for additional information regarding copyright ownership.
5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  The ASF licenses this file to You under the Apache License, Version 2.0
6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  (the "License"); you may not use this file except in compliance with
7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  the License.  You may obtain a copy of the License at
8adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *     http://www.apache.org/licenses/LICENSE-2.0
10adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  Unless required by applicable law or agreed to in writing, software
12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  distributed under the License is distributed on an "AS IS" BASIS,
13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  See the License for the specific language governing permissions and
15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  limitations under the License.
16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
188de7cf6bff36093dda9e25a1ab3718720cb54906Elliott Hughespackage java.net;
19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
20f7aab022dcbfcd8f27b409ab92b4bca4a84d0b8aBrian Carlstromimport dalvik.system.CloseGuard;
21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.FileDescriptor;
22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.IOException;
23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.net.DatagramPacket;
24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.net.DatagramSocketImpl;
25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.net.InetAddress;
26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.net.InetSocketAddress;
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;
326186821cb13f4ac7ff50950c813394367e021eaeJesse Wilsonimport libcore.util.EmptyArray;
33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.apache.harmony.luni.platform.Platform;
34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/**
368de7cf6bff36093dda9e25a1ab3718720cb54906Elliott Hughes * @hide used in java.nio.
37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
38f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilsonpublic class PlainDatagramSocketImpl extends DatagramSocketImpl {
39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
400b29a1fecc601de2f642ded891726ac3e460d74bElliott Hughes    private static final int MCAST_JOIN_GROUP = 19;
410b29a1fecc601de2f642ded891726ac3e460d74bElliott Hughes    private static final int MCAST_LEAVE_GROUP = 20;
420b29a1fecc601de2f642ded891726ac3e460d74bElliott Hughes
43f3afb1b6a4ace33bd60e5801bdb2fcb2e935d486Elliott Hughes    private static final int SO_BROADCAST = 32;
44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
450d4ce4227fa818288b8db762b640dfa21e3162f5Elliott Hughes    private static final int IP_MULTICAST_TTL = 17;
46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private volatile boolean isNativeConnected;
48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
4912f2d8e2760b78c673b7a187b9062b3938a03147Brian Carlstrom    private final CloseGuard guard = CloseGuard.get();
50f7aab022dcbfcd8f27b409ab92b4bca4a84d0b8aBrian Carlstrom
51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * used to keep address to which the socket was connected to at the native
53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * level
54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private InetAddress connectedAddress;
56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private int connectedPort = -1;
58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public PlainDatagramSocketImpl(FileDescriptor fd, int localPort) {
60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        super();
61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.fd = fd;
62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.localPort = localPort;
63f7aab022dcbfcd8f27b409ab92b4bca4a84d0b8aBrian Carlstrom        if (fd.valid()) {
64f7aab022dcbfcd8f27b409ab92b4bca4a84d0b8aBrian Carlstrom            guard.open("close");
65f7aab022dcbfcd8f27b409ab92b4bca4a84d0b8aBrian Carlstrom        }
66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public PlainDatagramSocketImpl() {
69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        super();
70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        fd = new FileDescriptor();
71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void bind(int port, InetAddress addr) throws SocketException {
753db0d1b07a79c3c871b0aa0929674adae3081b4fElliott Hughes        Platform.NETWORK.bind(fd, addr, port);
763db0d1b07a79c3c871b0aa0929674adae3081b4fElliott Hughes        if (port != 0) {
77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            localPort = port;
78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } else {
793db0d1b07a79c3c871b0aa0929674adae3081b4fElliott Hughes            localPort = Platform.NETWORK.getSocketLocalPort(fd);
80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            setOption(SO_BROADCAST, Boolean.TRUE);
8458e5a8e6eeaf94d78522e0e9994c4565a3b33fdbJesse Wilson        } catch (IOException ignored) {
85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
89c6e0981e5a2d23a0758ed71a8086c4278a7832efJesse Wilson    public synchronized void close() {
90f7aab022dcbfcd8f27b409ab92b4bca4a84d0b8aBrian Carlstrom        guard.close();
91c6e0981e5a2d23a0758ed71a8086c4278a7832efJesse Wilson        try {
92c6e0981e5a2d23a0758ed71a8086c4278a7832efJesse Wilson            Platform.NETWORK.close(fd);
93c6e0981e5a2d23a0758ed71a8086c4278a7832efJesse Wilson        } catch (IOException ignored) {
94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void create() throws SocketException {
993db0d1b07a79c3c871b0aa0929674adae3081b4fElliott Hughes        Platform.NETWORK.socket(fd, false);
100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
102e2f58c9501eac730d048199906dc41fe8e4cd6e9Brian Carlstrom    @Override protected void finalize() throws Throwable {
103e2f58c9501eac730d048199906dc41fe8e4cd6e9Brian Carlstrom        try {
10412f2d8e2760b78c673b7a187b9062b3938a03147Brian Carlstrom            if (guard != null) {
10512f2d8e2760b78c673b7a187b9062b3938a03147Brian Carlstrom                guard.warnIfOpen();
10612f2d8e2760b78c673b7a187b9062b3938a03147Brian Carlstrom            }
10712f2d8e2760b78c673b7a187b9062b3938a03147Brian Carlstrom            close();
108e2f58c9501eac730d048199906dc41fe8e4cd6e9Brian Carlstrom        } finally {
109e2f58c9501eac730d048199906dc41fe8e4cd6e9Brian Carlstrom            super.finalize();
110e2f58c9501eac730d048199906dc41fe8e4cd6e9Brian Carlstrom        }
111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Object getOption(int optID) throws SocketException {
1143db0d1b07a79c3c871b0aa0929674adae3081b4fElliott Hughes        return Platform.NETWORK.getSocketOption(fd, optID);
115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int getTimeToLive() throws IOException {
11958e5a8e6eeaf94d78522e0e9994c4565a3b33fdbJesse Wilson        return (Integer) getOption(IP_MULTICAST_TTL);
120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public byte getTTL() throws IOException {
1244401c75ac7d85da33472d0398d8166df6ce4beb5Elliott Hughes        return (byte) getTimeToLive();
125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void join(InetAddress addr) throws IOException {
1290b29a1fecc601de2f642ded891726ac3e460d74bElliott Hughes        setOption(MCAST_JOIN_GROUP, new MulticastGroupRequest(addr, null));
130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void joinGroup(SocketAddress addr, NetworkInterface netInterface) throws IOException {
134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (addr instanceof InetSocketAddress) {
135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            InetAddress groupAddr = ((InetSocketAddress) addr).getAddress();
1360b29a1fecc601de2f642ded891726ac3e460d74bElliott Hughes            setOption(MCAST_JOIN_GROUP, new MulticastGroupRequest(groupAddr, netInterface));
137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void leave(InetAddress addr) throws IOException {
1420b29a1fecc601de2f642ded891726ac3e460d74bElliott Hughes        setOption(MCAST_LEAVE_GROUP, new MulticastGroupRequest(addr, null));
143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
1460b29a1fecc601de2f642ded891726ac3e460d74bElliott Hughes    public void leaveGroup(SocketAddress addr, NetworkInterface netInterface) throws IOException {
147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (addr instanceof InetSocketAddress) {
148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            InetAddress groupAddr = ((InetSocketAddress) addr).getAddress();
1490b29a1fecc601de2f642ded891726ac3e460d74bElliott Hughes            setOption(MCAST_LEAVE_GROUP, new MulticastGroupRequest(groupAddr, netInterface));
150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected int peek(InetAddress sender) throws IOException {
155753dcd862b31e85766225590d90ba0b9f481176fElliott Hughes        // We don't actually want the data: we just want the DatagramPacket's filled-in address.
156693eacca9fa67ad79d1b35dbaad61c5ac1ac457cElliott Hughes        DatagramPacket packet = new DatagramPacket(EmptyArray.BYTE, 0);
157753dcd862b31e85766225590d90ba0b9f481176fElliott Hughes        int result = peekData(packet);
1583db0d1b07a79c3c871b0aa0929674adae3081b4fElliott Hughes        Platform.NETWORK.setInetAddress(sender, packet.getAddress().getAddress());
159753dcd862b31e85766225590d90ba0b9f481176fElliott Hughes        return result;
160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
16279ff4e73fd689dae6667a8137ee57137962ff13aElliott Hughes    private void doRecv(DatagramPacket pack, boolean peek) throws IOException {
1633db0d1b07a79c3c871b0aa0929674adae3081b4fElliott Hughes        Platform.NETWORK.recv(fd, pack, pack.getData(), pack.getOffset(), pack.getLength(), peek,
1649f2b1b1c3bf9de560f29f257c855c7c85b405c0fElliott Hughes                isNativeConnected);
1659f2b1b1c3bf9de560f29f257c855c7c85b405c0fElliott Hughes        if (isNativeConnected) {
1669f2b1b1c3bf9de560f29f257c855c7c85b405c0fElliott Hughes            updatePacketRecvAddress(pack);
167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
17179ff4e73fd689dae6667a8137ee57137962ff13aElliott Hughes    public void receive(DatagramPacket pack) throws IOException {
17279ff4e73fd689dae6667a8137ee57137962ff13aElliott Hughes        doRecv(pack, false);
17379ff4e73fd689dae6667a8137ee57137962ff13aElliott Hughes    }
17479ff4e73fd689dae6667a8137ee57137962ff13aElliott Hughes
17579ff4e73fd689dae6667a8137ee57137962ff13aElliott Hughes    @Override
17679ff4e73fd689dae6667a8137ee57137962ff13aElliott Hughes    public int peekData(DatagramPacket pack) throws IOException {
17779ff4e73fd689dae6667a8137ee57137962ff13aElliott Hughes        doRecv(pack, true);
17879ff4e73fd689dae6667a8137ee57137962ff13aElliott Hughes        return pack.getPort();
17979ff4e73fd689dae6667a8137ee57137962ff13aElliott Hughes    }
18079ff4e73fd689dae6667a8137ee57137962ff13aElliott Hughes
18179ff4e73fd689dae6667a8137ee57137962ff13aElliott Hughes    @Override
182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void send(DatagramPacket packet) throws IOException {
183221d0ccb4cc23ee0bf0646e9abe471fb48b3a1a8Elliott Hughes        int port = isNativeConnected ? 0 : packet.getPort();
184221d0ccb4cc23ee0bf0646e9abe471fb48b3a1a8Elliott Hughes        InetAddress address = isNativeConnected ? null : packet.getAddress();
185f7aab022dcbfcd8f27b409ab92b4bca4a84d0b8aBrian Carlstrom        Platform.NETWORK.send(fd, packet.getData(), packet.getOffset(), packet.getLength(),
186f7aab022dcbfcd8f27b409ab92b4bca4a84d0b8aBrian Carlstrom                              port, address);
187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setOption(int optID, Object val) throws SocketException {
1903db0d1b07a79c3c871b0aa0929674adae3081b4fElliott Hughes        Platform.NETWORK.setSocketOption(fd, optID, val);
191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
194fdd13e86ec613e46b68376f90d2c89c2ac33b4b5Elliott Hughes    public void setTimeToLive(int ttl) throws IOException {
195a9a57f2581773484d13e160fd3407692e825971aElliott Hughes        setOption(IP_MULTICAST_TTL, Integer.valueOf(ttl));
196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
199fdd13e86ec613e46b68376f90d2c89c2ac33b4b5Elliott Hughes    public void setTTL(byte ttl) throws IOException {
2004d8e9333e494ceedff074def3b6e44f523f3830eElliott Hughes        setTimeToLive((int) ttl & 0xff); // Avoid sign extension.
201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void connect(InetAddress inetAddr, int port) throws SocketException {
2053db0d1b07a79c3c871b0aa0929674adae3081b4fElliott Hughes        Platform.NETWORK.connect(fd, inetAddr, port, 0);
206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // if we get here then we are connected at the native level
208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            connectedAddress = InetAddress.getByAddress(inetAddr.getAddress());
210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (UnknownHostException e) {
211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // this is never expected to happen as we should not have gotten
212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // here if the address is not resolvable
213b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes            throw new SocketException("Host is unresolved: " + inetAddr.getHostName());
214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        connectedPort = port;
216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        isNativeConnected = true;
217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void disconnect() {
221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
2223db0d1b07a79c3c871b0aa0929674adae3081b4fElliott Hughes            Platform.NETWORK.disconnectDatagram(fd);
22358e5a8e6eeaf94d78522e0e9994c4565a3b33fdbJesse Wilson        } catch (Exception ignored) {
224adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        connectedPort = -1;
226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        connectedAddress = null;
227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        isNativeConnected = false;
228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Set the received address and port in the packet. We do this when the
232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Datagram socket is connected at the native level and the
233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * recvConnnectedDatagramImpl does not update the packet with address from
234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * which the packet was received
235f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param packet
237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the packet to be updated
238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private void updatePacketRecvAddress(DatagramPacket packet) {
240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        packet.setAddress(connectedAddress);
241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        packet.setPort(connectedPort);
242adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
244