ECode DatagramChannelImpl::DatagramSocketAdapter::Connect( /* [in] */ ISocketAddress* peer) { Boolean bval; if (IsConnected(&bval), bval) { // RI compatibility: If the socket is already connected this fails. // throw new IllegalStateException("Socket is already connected."); return E_ILLEGAL_STATE_EXCEPTION; } FAIL_RETURN(DatagramSocket::Connect(peer)) // Connect may have performed an implicit bind(). Sync up here. mChannelImpl->OnBind(FALSE /* updateSocketState */); IInetSocketAddress* inetSocketAddress = IInetSocketAddress::Probe(peer); AutoPtr<IInetAddress> address; inetSocketAddress->GetAddress((IInetAddress**)&address); Int32 port; inetSocketAddress->GetPort(&port); return mChannelImpl->OnConnect(address, port, FALSE /* updateSocketState */); }
ECode DatagramSocket::constructor( /* [in] */ ISocketAddress* localAddr) { if (localAddr != NULL) { IInetSocketAddress* netSocketAddr = IInetSocketAddress::Probe(localAddr); if (netSocketAddr == NULL) { ALOGD("Error in DatagramSocket: Local address not an InetSocketAddress!"); return E_ILLEGAL_ARGUMENT_EXCEPTION; } Int32 port; netSocketAddr->GetPort(&port); FAIL_RETURN(CheckPort(port)); } if (mFactory != NULL) { mFactory->CreateDatagramSocketImpl((IDatagramSocketImpl**)&mImpl); } else { CPlainDatagramSocketImpl::New((IDatagramSocketImpl**)&mImpl); } mImpl->Create(); if (localAddr != NULL) { // try { ECode ec = Bind(localAddr); if (FAILED(ec)) { Close(); ALOGD("Error in DatagramSocket: failed to bind socket!"); return ec; } // } catch (SocketException e) { // close(); // throw e; // } } // SocketOptions.SO_BROADCAST is set by default for DatagramSocket return SetBroadcast(TRUE); }