diff options
-rw-r--r-- | compat/Makefile.am | 4 | ||||
-rw-r--r-- | compat/java.net/GetSocketOptionInfo.java | 39 | ||||
-rw-r--r-- | compat/java.net/Makefile.am | 14 | ||||
-rw-r--r-- | compat/java.net/PlainSocketImpl.java | 266 | ||||
-rw-r--r-- | compat/java.net/README | 27 |
5 files changed, 350 insertions, 0 deletions
diff --git a/compat/Makefile.am b/compat/Makefile.am new file mode 100644 index 000000000..1376de35c --- /dev/null +++ b/compat/Makefile.am @@ -0,0 +1,4 @@ +## Input file for automake to generate the Makefile.in used by configure + +SUBDIRS = java.net + diff --git a/compat/java.net/GetSocketOptionInfo.java b/compat/java.net/GetSocketOptionInfo.java new file mode 100644 index 000000000..1a5f351e6 --- /dev/null +++ b/compat/java.net/GetSocketOptionInfo.java @@ -0,0 +1,39 @@ +// Class to identify socket option constants. + +import java.io.*; +import java.net.*; + +public class GetSocketOptionInfo extends Socket implements SocketImplFactory +{ + +public SocketImpl +createSocketImpl() +{ + return(new PlainSocketImpl()); +} + +public static void +main(String[] argv) throws IOException +{ + Socket.setSocketImplFactory(new GetSocketOptionInfo()); + + Socket s = new Socket(); + + System.err.println("Setting TCP_NODELAY on"); + s.setTcpNoDelay(true); + System.err.println("Setting TCP_NODELAY off"); + s.setTcpNoDelay(false); + + System.err.println("Setting SO_LINGER on"); + s.setSoLinger(true, 10); + System.err.println("Setting SO_LINGER off"); + s.setSoLinger(false, 1); + + System.err.println("Setting SO_TIMEOUT to 15"); + s.setSoTimeout(15); + System.err.println("Setting SO_TIMEOUT to 0"); + s.setSoTimeout(0); +} + +} + diff --git a/compat/java.net/Makefile.am b/compat/java.net/Makefile.am new file mode 100644 index 000000000..34da4f3c2 --- /dev/null +++ b/compat/java.net/Makefile.am @@ -0,0 +1,14 @@ +## Input file for automake to generate the Makefile.in used by configure + +# Hmm.. This doesn't seem to work +#noinst_JAVA = GetSocketOptionInfo.java PlainSocketImpl.java + +JAVAROOT = . + +compatdir = $(datadir)/compat/java.net + +compat_JAVA = GetSocketOptionInfo.java PlainSocketImpl.java + + +EXTRA_DIST = README + diff --git a/compat/java.net/PlainSocketImpl.java b/compat/java.net/PlainSocketImpl.java new file mode 100644 index 000000000..c61862627 --- /dev/null +++ b/compat/java.net/PlainSocketImpl.java @@ -0,0 +1,266 @@ +/************************************************************************* +/* PlainSocketImpl.java -- Default socket implementation +/* +/* Copyright (c) 1998 by Aaron M. Renn (arenn@urbanophile.com) +/* +/* This program is free software; you can redistribute it and/or modify +/* it under the terms of the GNU Library General Public License as published +/* by the Free Software Foundation, version 2. (see COPYING.LIB) +/* +/* This program is distributed in the hope that it will be useful, but +/* WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with this program; if not, write to the Free Software Foundation +/* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307 USA +/*************************************************************************/ + +import java.net.*; +import java.io.InputStream; +import java.io.OutputStream; +import java.io.IOException; + +/** + * Unless the application installs its own SocketImplFactory, this is the + * default socket implemetation that will be used. It simply uses a + * combination of Java and native routines to implement standard BSD + * style sockets of family AF_INET and types SOCK_STREAM and SOCK_DGRAM + * + * @version 0.1 + * + * @author Aaron M. Renn (arenn@urbanophile.com) + */ +class PlainSocketImpl extends SocketImpl +{ + +/*************************************************************************/ + +/* + * Static Variables + */ + +/* +// Static initializer to load native library +static +{ + System.loadLibrary("javanet"); +} +*/ + +/*************************************************************************/ + +/* + * Instance Variables + */ + +/** + * This is the native file descriptor for this socket + */ +protected int native_fd = -1; + +/*************************************************************************/ + +/** + * Default do nothing constructor + */ +public +PlainSocketImpl() +{ + ; +} + +/*************************************************************************/ + +/** + * Accepts a new connection on this socket and returns in in the + * passed in SocketImpl. + * + * @param impl The SocketImpl object to accept this connection. + */ +protected native void +accept(SocketImpl impl) throws IOException; + +/*************************************************************************/ + +/** + * Returns the number of bytes that the caller can read from this socket + * without blocking. //*****Figure out if we can do something here + * + * @return The number of readable bytes before blocking + * + * @exception IOException If an error occurs + */ +protected int +available() throws IOException +{ + return(0); +} + +/*************************************************************************/ + +/** + * Binds to the specified port on the specified addr. Note that this addr + * must represent a local IP address. **** How bind to INADDR_ANY? **** + * + * @param addr The address to bind to + * @param port The port number to bind to + * + * @exception IOException If an error occurs + */ +protected native void +bind(InetAddress addr, int port) throws IOException; + +/*************************************************************************/ + +/** + * Closes the socket. This will cause any InputStream or OutputStream + * objects for this Socket to be closed as well. + * <p> + * Note that if the SO_LINGER option is set on this socket, then the + * operation could block. + * + * @exception IOException If an error occurs + */ +protected native void +close() throws IOException; + +/*************************************************************************/ + +/** + * Connects to the remote address and port specified as arguments. + * + * @param addr The remote address to connect to + * @param port The remote port to connect to + * + * @exception IOException If an error occurs + */ +protected void +connect(InetAddress addr, int port) throws IOException +{ + return; +} + +/*************************************************************************/ + +/** + * Connects to the remote hostname and port specified as arguments. + * + * @param hostname The remote hostname to connect to + * @param port The remote port to connect to + * + * @exception IOException If an error occurs + */ +protected void +connect(String hostname, int port) throws IOException +{ + InetAddress addr = InetAddress.getByName(hostname); + connect(addr, port); +} + +/*************************************************************************/ + +/** + * Creates a new socket that is not bound to any local address/port and + * is not connected to any remote address/port. This will be created as + * a stream socket if the stream parameter is true, or a datagram socket + * if the stream parameter is false. + * + * @param stream true for a stream socket, false for a datagram socket + */ +protected native void +create(boolean stream) throws IOException; + +/*************************************************************************/ + +/** + * Starts listening for connections on a socket. The queuelen parameter + * is how many pending connections will queue up waiting to be serviced + * before being accept'ed. If the queue of pending requests exceeds this + * number, additional connections will be refused. + * + * @param queuelen The length of the pending connection queue + * + * @exception IOException If an error occurs + */ +protected native void +listen(int queuelen) throws IOException; + +/*************************************************************************/ + +/** + * Sets the specified option on a socket to the passed in object. For + * options that take an integer argument, the passed in object is an + * Integer. The option_id parameter is one of the defined constants in + * this interface. + * + * @param option_id The identifier of the option + * @param val The value to set the option to + * + * @exception SocketException If an error occurs + */ +public void +setOption(int option_id, Object val) throws SocketException +{ +//*** Do non-native for now + System.err.println("Option Id=" + option_id); + System.err.println("Object is: " + val.getClass().getName()); + System.err.println("Object value is: " + val); +} + +/*************************************************************************/ + +/** + * Returns the current setting of the specified option. The Object returned + * will be an Integer for options that have integer values. The option_id + * is one of the defined constants in this interface. + * + * @param option_id The option identifier + * + * @return The current value of the option + * + * @exception SocketException If an error occurs + */ +public Object +getOption(int option_id) throws SocketException +{ +//**** Do non-native for now + System.err.println("Option Id=" + option_id); + return(null); +} + +/*************************************************************************/ + +/** + * Returns an InputStream object for reading from this socket. This will + * be an instance of SocketInputStream. + * + * @return An InputStream + * + * @exception IOException If an error occurs + */ +protected InputStream +getInputStream() throws IOException +{ + return(null); +} + +/*************************************************************************/ + +/** + * Returns an OutputStream object for writing to this socket. This will + * be an instance of SocketOutputStream. + * + * @return An OutputStream + * + * @exception IOException If an error occurs + */ +protected OutputStream +getOutputStream() throws IOException +{ + return(null); +} + +} // class PlainSocketImpl + diff --git a/compat/java.net/README b/compat/java.net/README new file mode 100644 index 000000000..f249b7516 --- /dev/null +++ b/compat/java.net/README @@ -0,0 +1,27 @@ +This directory contains various "experiment" programs used to determine +the behavior of the java.net class where such behavior is not sufficiently +documented by Sun in order to write an implementation from docs alone. + +Some key findings: + +The setOption/getOption methods are discussed in the "Networking Enhancements" +document for Java 1.1 but are not in the javadocs. However, the SocketImpl +class is shown implementing a SocketOptions interface that is not documented. +We assume this is a non-public interface which contains abstract declarations +of the get/setOption methods as well as contants for the option_id's. + +TCP_NODELAY: + The option id of this option is 1. The Object passed to setOption is + a Boolean indicating whether this option should be on (true) or off (false). + +SO_LINGER: + The option id of this option is 128. When SO_LINGER is to be disabled, + the Object passed to setOption is Boolean with a value of false. When + SO_LINGER is to be enabled, the Object passed to setOption is an Integer + set to the linger value. + +SO_TIMEOUT: + The option id of this option is 4102. The Object passed to setOption is + an Integer that is the new timeout value (0 to disable). + + |