PlainDatagramSocketImpl.java revision 23ec09188303a874b3b391f96ae0a29af002bff9
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;
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;
31454a95f6a28855aa3c88d168b15a45bf315efc99Elliott Hughesimport libcore.io.IoUtils;
3232b0fa4d1a31ef07bc4297c615f0fe50e9aa7c21Elliott Hughesimport libcore.io.Libcore;
33438cb9e440d250c8aa5daf4fae0c400dce8b1499Elliott Hughesimport libcore.io.StructGroupReq;
346186821cb13f4ac7ff50950c813394367e021eaeJesse Wilsonimport libcore.util.EmptyArray;
3523ec09188303a874b3b391f96ae0a29af002bff9Elliott Hughesimport static libcore.io.OsConstants.*;
36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/**
388de7cf6bff36093dda9e25a1ab3718720cb54906Elliott Hughes * @hide used in java.nio.
39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
40f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilsonpublic class PlainDatagramSocketImpl extends DatagramSocketImpl {
41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private volatile boolean isNativeConnected;
43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
4412f2d8e2760b78c673b7a187b9062b3938a03147Brian Carlstrom    private final CloseGuard guard = CloseGuard.get();
45f7aab022dcbfcd8f27b409ab92b4bca4a84d0b8aBrian Carlstrom
46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * used to keep address to which the socket was connected to at the native
48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * level
49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private InetAddress connectedAddress;
51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private int connectedPort = -1;
53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public PlainDatagramSocketImpl(FileDescriptor fd, int localPort) {
55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.fd = fd;
56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.localPort = localPort;
57f7aab022dcbfcd8f27b409ab92b4bca4a84d0b8aBrian Carlstrom        if (fd.valid()) {
58f7aab022dcbfcd8f27b409ab92b4bca4a84d0b8aBrian Carlstrom            guard.open("close");
59f7aab022dcbfcd8f27b409ab92b4bca4a84d0b8aBrian Carlstrom        }
60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public PlainDatagramSocketImpl() {
63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        fd = new FileDescriptor();
64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
67da15009528cc8300a6251f1d0931ac8657c9fc31Elliott Hughes    public void bind(int port, InetAddress address) throws SocketException {
68da15009528cc8300a6251f1d0931ac8657c9fc31Elliott Hughes        IoUtils.bind(fd, address, port);
693db0d1b07a79c3c871b0aa0929674adae3081b4fElliott Hughes        if (port != 0) {
70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            localPort = port;
71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } else {
720a9d1ee45a9884a9616624d747172e18734e8fe0Elliott Hughes            localPort = IoUtils.getSocketLocalPort(fd);
73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
750a9d1ee45a9884a9616624d747172e18734e8fe0Elliott Hughes            setOption(SocketOptions.SO_BROADCAST, Boolean.TRUE);
7658e5a8e6eeaf94d78522e0e9994c4565a3b33fdbJesse Wilson        } catch (IOException ignored) {
77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
81c6e0981e5a2d23a0758ed71a8086c4278a7832efJesse Wilson    public synchronized void close() {
82f7aab022dcbfcd8f27b409ab92b4bca4a84d0b8aBrian Carlstrom        guard.close();
83c6e0981e5a2d23a0758ed71a8086c4278a7832efJesse Wilson        try {
84e27d02044ec399884bfd4343d513bf270b9b9b11Elliott Hughes            IoUtils.closeSocket(fd);
85c6e0981e5a2d23a0758ed71a8086c4278a7832efJesse 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
90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void create() throws SocketException {
91454a95f6a28855aa3c88d168b15a45bf315efc99Elliott Hughes        this.fd = IoUtils.socket(false);
92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
94e2f58c9501eac730d048199906dc41fe8e4cd6e9Brian Carlstrom    @Override protected void finalize() throws Throwable {
95e2f58c9501eac730d048199906dc41fe8e4cd6e9Brian Carlstrom        try {
9612f2d8e2760b78c673b7a187b9062b3938a03147Brian Carlstrom            if (guard != null) {
9712f2d8e2760b78c673b7a187b9062b3938a03147Brian Carlstrom                guard.warnIfOpen();
9812f2d8e2760b78c673b7a187b9062b3938a03147Brian Carlstrom            }
9912f2d8e2760b78c673b7a187b9062b3938a03147Brian Carlstrom            close();
100e2f58c9501eac730d048199906dc41fe8e4cd6e9Brian Carlstrom        } finally {
101e2f58c9501eac730d048199906dc41fe8e4cd6e9Brian Carlstrom            super.finalize();
102e2f58c9501eac730d048199906dc41fe8e4cd6e9Brian Carlstrom        }
103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1050a9d1ee45a9884a9616624d747172e18734e8fe0Elliott Hughes    @Override public Object getOption(int option) throws SocketException {
1060a9d1ee45a9884a9616624d747172e18734e8fe0Elliott Hughes        return IoUtils.getSocketOption(fd, option);
107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int getTimeToLive() throws IOException {
111c63f0d4e80a9fd3bdf99cd438d108b750226736aElliott Hughes        return (Integer) getOption(IoUtils.JAVA_IP_MULTICAST_TTL);
112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public byte getTTL() throws IOException {
1164401c75ac7d85da33472d0398d8166df6ce4beb5Elliott Hughes        return (byte) getTimeToLive();
117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
119438cb9e440d250c8aa5daf4fae0c400dce8b1499Elliott Hughes    private static StructGroupReq makeGroupReq(InetAddress gr_group, NetworkInterface networkInterface) {
120438cb9e440d250c8aa5daf4fae0c400dce8b1499Elliott Hughes        int gr_interface = (networkInterface != null) ? networkInterface.getIndex() : 0;
121438cb9e440d250c8aa5daf4fae0c400dce8b1499Elliott Hughes        return new StructGroupReq(gr_interface, gr_group);
122438cb9e440d250c8aa5daf4fae0c400dce8b1499Elliott Hughes    }
123438cb9e440d250c8aa5daf4fae0c400dce8b1499Elliott Hughes
124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void join(InetAddress addr) throws IOException {
126438cb9e440d250c8aa5daf4fae0c400dce8b1499Elliott Hughes        setOption(IoUtils.JAVA_MCAST_JOIN_GROUP, makeGroupReq(addr, null));
127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void joinGroup(SocketAddress addr, NetworkInterface netInterface) throws IOException {
131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (addr instanceof InetSocketAddress) {
132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            InetAddress groupAddr = ((InetSocketAddress) addr).getAddress();
133438cb9e440d250c8aa5daf4fae0c400dce8b1499Elliott Hughes            setOption(IoUtils.JAVA_MCAST_JOIN_GROUP, makeGroupReq(groupAddr, netInterface));
134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void leave(InetAddress addr) throws IOException {
139438cb9e440d250c8aa5daf4fae0c400dce8b1499Elliott Hughes        setOption(IoUtils.JAVA_MCAST_LEAVE_GROUP, makeGroupReq(addr, null));
140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
1430b29a1fecc601de2f642ded891726ac3e460d74bElliott Hughes    public void leaveGroup(SocketAddress addr, NetworkInterface netInterface) throws IOException {
144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (addr instanceof InetSocketAddress) {
145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            InetAddress groupAddr = ((InetSocketAddress) addr).getAddress();
146438cb9e440d250c8aa5daf4fae0c400dce8b1499Elliott Hughes            setOption(IoUtils.JAVA_MCAST_LEAVE_GROUP, makeGroupReq(groupAddr, netInterface));
147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected int peek(InetAddress sender) throws IOException {
152753dcd862b31e85766225590d90ba0b9f481176fElliott Hughes        // We don't actually want the data: we just want the DatagramPacket's filled-in address.
153693eacca9fa67ad79d1b35dbaad61c5ac1ac457cElliott Hughes        DatagramPacket packet = new DatagramPacket(EmptyArray.BYTE, 0);
154753dcd862b31e85766225590d90ba0b9f481176fElliott Hughes        int result = peekData(packet);
15523ec09188303a874b3b391f96ae0a29af002bff9Elliott Hughes        // Note: evil side-effect on InetAddress! This method should have returned InetSocketAddress!
1562f03ccad590827233fcba84a8b6eafcd414e5fe7Elliott Hughes        sender.ipaddress = packet.getAddress().getAddress();
157753dcd862b31e85766225590d90ba0b9f481176fElliott Hughes        return result;
158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
16023ec09188303a874b3b391f96ae0a29af002bff9Elliott Hughes    private void doRecv(DatagramPacket pack, int flags) throws IOException {
16123ec09188303a874b3b391f96ae0a29af002bff9Elliott Hughes        IoUtils.recvfrom(false, fd, pack.getData(), pack.getOffset(), pack.getLength(), flags, pack, isNativeConnected);
1629f2b1b1c3bf9de560f29f257c855c7c85b405c0fElliott Hughes        if (isNativeConnected) {
1639f2b1b1c3bf9de560f29f257c855c7c85b405c0fElliott Hughes            updatePacketRecvAddress(pack);
164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
16879ff4e73fd689dae6667a8137ee57137962ff13aElliott Hughes    public void receive(DatagramPacket pack) throws IOException {
16923ec09188303a874b3b391f96ae0a29af002bff9Elliott Hughes        doRecv(pack, 0);
17079ff4e73fd689dae6667a8137ee57137962ff13aElliott Hughes    }
17179ff4e73fd689dae6667a8137ee57137962ff13aElliott Hughes
17279ff4e73fd689dae6667a8137ee57137962ff13aElliott Hughes    @Override
17379ff4e73fd689dae6667a8137ee57137962ff13aElliott Hughes    public int peekData(DatagramPacket pack) throws IOException {
17423ec09188303a874b3b391f96ae0a29af002bff9Elliott Hughes        doRecv(pack, MSG_PEEK);
17579ff4e73fd689dae6667a8137ee57137962ff13aElliott Hughes        return pack.getPort();
17679ff4e73fd689dae6667a8137ee57137962ff13aElliott Hughes    }
17779ff4e73fd689dae6667a8137ee57137962ff13aElliott Hughes
17879ff4e73fd689dae6667a8137ee57137962ff13aElliott Hughes    @Override
179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void send(DatagramPacket packet) throws IOException {
180221d0ccb4cc23ee0bf0646e9abe471fb48b3a1a8Elliott Hughes        int port = isNativeConnected ? 0 : packet.getPort();
181221d0ccb4cc23ee0bf0646e9abe471fb48b3a1a8Elliott Hughes        InetAddress address = isNativeConnected ? null : packet.getAddress();
18290d96a4f168b7e56cff54dc94dca2f3cde60ebcdElliott Hughes        IoUtils.sendto(fd, packet.getData(), packet.getOffset(), packet.getLength(), 0, address, port);
183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
185c63f0d4e80a9fd3bdf99cd438d108b750226736aElliott Hughes    public void setOption(int option, Object value) throws SocketException {
186c63f0d4e80a9fd3bdf99cd438d108b750226736aElliott Hughes        IoUtils.setSocketOption(fd, option, value);
187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
190fdd13e86ec613e46b68376f90d2c89c2ac33b4b5Elliott Hughes    public void setTimeToLive(int ttl) throws IOException {
191c63f0d4e80a9fd3bdf99cd438d108b750226736aElliott Hughes        setOption(IoUtils.JAVA_IP_MULTICAST_TTL, Integer.valueOf(ttl));
192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
195fdd13e86ec613e46b68376f90d2c89c2ac33b4b5Elliott Hughes    public void setTTL(byte ttl) throws IOException {
1964d8e9333e494ceedff074def3b6e44f523f3830eElliott Hughes        setTimeToLive((int) ttl & 0xff); // Avoid sign extension.
197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void connect(InetAddress inetAddr, int port) throws SocketException {
201220c0af1763283b75617226efe3919c3e3b044c8Elliott Hughes        IoUtils.connect(fd, inetAddr, port); // Throws on failure.
202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            connectedAddress = InetAddress.getByAddress(inetAddr.getAddress());
204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (UnknownHostException e) {
205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // this is never expected to happen as we should not have gotten
206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // here if the address is not resolvable
207b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes            throw new SocketException("Host is unresolved: " + inetAddr.getHostName());
208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        connectedPort = port;
210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        isNativeConnected = true;
211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void disconnect() {
21532b0fa4d1a31ef07bc4297c615f0fe50e9aa7c21Elliott Hughes        Libcore.os.connect(fd, InetAddress.UNSPECIFIED, 0);
216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        connectedPort = -1;
217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        connectedAddress = null;
218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        isNativeConnected = false;
219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Set the received address and port in the packet. We do this when the
223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Datagram socket is connected at the native level and the
224adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * recvConnnectedDatagramImpl does not update the packet with address from
225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * which the packet was received
226f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param packet
228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the packet to be updated
229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private void updatePacketRecvAddress(DatagramPacket packet) {
231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        packet.setAddress(connectedAddress);
232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        packet.setPort(connectedPort);
233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
235