natPlainSocketImpl.cc (bind): Bind to any/all network interfaces if host==NULL.
* java/net/natPlainSocketImpl.cc (bind): Bind to any/all network interfaces if host==NULL. (accept): Throw message with InterruptedIOException. (getOption): Cache localAddress. * java/net/natPlainDatagramSocketImpl.cc (bind): Don't need 'address' for DatagramSocket. (setTimeToLive): Fix compiler warnings. (getOption): Cache localAddress. * java/net/Socket.java (getLocalAddress): Don't need local InetAddress object. Add FIXME comment about calling checkConnect(). * java/net/ServerSocket.java (ServerSocket(int)): Initialize connection queue to 50 as per JDK 1.2 docs. (ServerSocket(int,int)): Listen on all network interfaces by default, per JDK 1.2 docs. * java/net/PlainDatagramSocketImpl.java: Don't need 'address'. Add localAddress caching. From-SVN: r27559
This commit is contained in:
parent
06c8baef3a
commit
1920afb3c6
7 changed files with 92 additions and 51 deletions
|
@ -65,14 +65,25 @@ void
|
|||
java::net::PlainSocketImpl::bind (java::net::InetAddress *host, jint lport)
|
||||
{
|
||||
union SockAddr u;
|
||||
jbyteArray haddress = host->address;
|
||||
jbyte *bytes = elements (haddress);
|
||||
int len = haddress->length;
|
||||
struct sockaddr *ptr = (struct sockaddr *) &u.address;
|
||||
jbyte *bytes = NULL;
|
||||
// FIXME: Use getaddrinfo() to get actual protocol instead of assuming ipv4.
|
||||
int len = 4; // Initialize for INADDR_ANY in case host is NULL.
|
||||
|
||||
if (host != NULL)
|
||||
{
|
||||
jbyteArray haddress = host->address;
|
||||
bytes = elements (haddress);
|
||||
len = haddress->length;
|
||||
}
|
||||
|
||||
if (len == 4)
|
||||
{
|
||||
u.address.sin_family = AF_INET;
|
||||
memcpy (&u.address.sin_addr, bytes, len);
|
||||
if (host != NULL)
|
||||
memcpy (&u.address.sin_addr, bytes, len);
|
||||
else
|
||||
u.address.sin_addr.s_addr = htonl (INADDR_ANY);
|
||||
len = sizeof (struct sockaddr_in);
|
||||
u.address.sin_port = htons (lport);
|
||||
}
|
||||
|
@ -183,7 +194,8 @@ java::net::PlainSocketImpl::accept (java::net::PlainSocketImpl *s)
|
|||
if ((retval = select (fnum + 1, &rset, NULL, NULL, &tv)) < 0)
|
||||
goto error;
|
||||
else if (retval == 0)
|
||||
JvThrow (new java::io::InterruptedIOException ());
|
||||
JvThrow (new java::io::InterruptedIOException (
|
||||
JvNewStringUTF("Accept timed out")));
|
||||
}
|
||||
|
||||
new_socket = ::accept (fnum, (sockaddr*) &u, &addrlen);
|
||||
|
@ -365,25 +377,29 @@ java::net::PlainSocketImpl::getOption (jint optID)
|
|||
#endif
|
||||
break;
|
||||
case _Jv_SO_BINDADDR_:
|
||||
// FIXME: Should cache the laddr as an optimization.
|
||||
jbyteArray laddr;
|
||||
if (::getsockname (fnum, (sockaddr*) &u, &addrlen) != 0)
|
||||
goto error;
|
||||
if (u.address.sin_family == AF_INET)
|
||||
// cache the local address
|
||||
if (localAddress == NULL)
|
||||
{
|
||||
laddr = JvNewByteArray (4);
|
||||
memcpy (elements (laddr), &u.address.sin_addr, 4);
|
||||
}
|
||||
jbyteArray laddr;
|
||||
if (::getsockname (fnum, (sockaddr*) &u, &addrlen) != 0)
|
||||
goto error;
|
||||
if (u.address.sin_family == AF_INET)
|
||||
{
|
||||
laddr = JvNewByteArray (4);
|
||||
memcpy (elements (laddr), &u.address.sin_addr, 4);
|
||||
}
|
||||
#ifdef HAVE_INET6
|
||||
else if (u.address.sin_family == AF_INET6)
|
||||
{
|
||||
laddr = JvNewByteArray (16);
|
||||
memcpy (elements (laddr), &u.address6.sin6_addr, 16);
|
||||
}
|
||||
else if (u.address.sin_family == AF_INET6)
|
||||
{
|
||||
laddr = JvNewByteArray (16);
|
||||
memcpy (elements (laddr), &u.address6.sin6_addr, 16);
|
||||
}
|
||||
#endif
|
||||
else
|
||||
goto error;
|
||||
return new java::net::InetAddress (laddr, NULL);
|
||||
else
|
||||
goto error;
|
||||
localAddress = new java::net::InetAddress (laddr, NULL);
|
||||
}
|
||||
return localAddress;
|
||||
break;
|
||||
case _Jv_IP_MULTICAST_IF_ :
|
||||
JvThrow (new java::net::SocketException (
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue