This is the mail archive of the java-patches@gcc.gnu.org mailing list for the Java project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Another socket stuff


Hello List,


Another patch for review.


Michael
Index: ChangeLog
===================================================================
RCS file: /cvs/gcc/gcc/libjava/ChangeLog,v
retrieving revision 1.1432
diff -u -b -r1.1432 ChangeLog
--- ChangeLog	10 Sep 2002 18:02:00 -0000	1.1432
+++ ChangeLog	10 Sep 2002 18:40:14 -0000
@@ -1,3 +1,23 @@
+2002-09-11  Michael Koch  <konqueror@gmx.de>
+
+	* java/net/Socket.java
+	(Socket): protected to public (since JDK 1.4).
+	(bind): New method.
+	(connect): Two new methods.
+	(getKeepalive): Get correct socket option.
+	(setKeepalive): Set correct socket option.
+	(getOOBInline): New method.
+	(setOOBInline): New method.
+	* java/net/ServerSocket.java
+	(bind): Two new methods.
+	(getInetAddress): Reimplemented, catch exception.
+	(getLocalSocketAddress): New method.
+	(setReuseAddress): New method.
+	(getReuseAdress): New method.
+	(setReceiveBufferSize): New method.
+	(getReceiveBufferSize): New method.
+	(toString): Made string JDK 1.4 compliant.
+
 2002-09-10  Michael Koch  <konqueror@gmx.de>
 
 	* java/net/SocketImpl.java
Index: java/net/Socket.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/java/net/Socket.java,v
retrieving revision 1.11
diff -u -b -r1.11 Socket.java
--- java/net/Socket.java	30 Aug 2002 18:16:00 -0000	1.11
+++ java/net/Socket.java	10 Sep 2002 18:40:15 -0000
@@ -85,7 +85,7 @@
    * connecting to a remote host.  This useful for subclasses of socket that 
    * might want this behavior.
    */
-  protected Socket ()
+  public Socket ()
   {
     if (factory != null)
       impl = factory.createSocketImpl();
@@ -266,6 +266,56 @@
   }
 
   /**
+   * Binds the socket to the givent local address/port
+   *
+   * @param bindpoint The address/port to bind to
+   *
+   * @exception If an error occurs
+   * 
+   * @since 1.4
+   */
+  public void bind (SocketAddress bindpoint) throws IOException
+  {
+    if ( !(bindpoint instanceof InetSocketAddress))
+      throw new IllegalArgumentException ();
+
+    InetSocketAddress tmp = (InetSocketAddress) bindpoint;
+    impl.bind (tmp.getAddress(), tmp.getPort());
+  }
+  
+  /**
+   * Connects the socket with a remote address.
+   *
+   * @param endpoint The address to connect to
+   *
+   * @exception IOException If an error occurs
+   * 
+   * @since 1.4
+   */
+  public void connect (SocketAddress endpoint)
+    throws IOException
+  {
+    impl.connect (endpoint, 0);
+  }
+
+  /**
+   * Connects the socket with a remote address. A timeout of zero is
+   * interpreted as an infinite timeout. The connection will then block
+   * until established or an error occurs.
+   *
+   * @param endpoint The address to connect to
+   *
+   * @exception IOException If an error occurs
+   * 
+   * @since 1.4
+   */
+  public void connect (SocketAddress endpoint, int timeout)
+    throws IOException
+  {
+    impl.connect (endpoint, timeout);
+  }
+
+  /**
    * Returns the address of the remote end of the socket.  If this socket
    * is not connected, then <code>null</code> is returned.
    *
@@ -473,6 +523,43 @@
   }
 
   /**
+   * Enables/disables the SO_OOBINLINE option
+   * 
+   * @param on True if SO_OOBLINE should be enabled 
+   * 
+   * @exception SocketException If an error occurs
+   * 
+   * @since 1.4
+   */
+  public void setOOBInline (boolean on) throws SocketException
+  {
+    if (impl == null)
+      throw new SocketException("Not connected");
+
+    impl.setOption(SocketOptions.SO_OOBINLINE, new Boolean(on));
+  }
+
+  /**
+   * Returns the current setting of the SO_OOBINLINE option for this socket
+   * 
+   * @exception SocketException If an error occurs
+   * 
+   * @since 1.4
+   */
+  public boolean getOOBInline () throws SocketException
+  {
+    if (impl == null)
+      throw new SocketException("Not connected");
+
+    Object buf = impl.getOption(SocketOptions.SO_OOBINLINE);
+
+    if (buf instanceof Boolean)
+      return(((Boolean)buf).booleanValue());
+    else
+      throw new SocketException("Internal Error: Unexpected type");
+  }
+  
+  /**
    * Sets the value of the SO_TIMEOUT option on the socket.  If this value
    * is set, and an read/write is performed that does not complete within
    * the timeout period, a short count is returned (or an EWOULDBLOCK signal
@@ -632,7 +719,7 @@
     if (impl == null)
       throw new SocketException("Not connected");
 
-    impl.setOption(SocketOptions.SO_RCVBUF, new Boolean(on));
+    impl.setOption(SocketOptions.SO_KEEPALIVE, new Boolean(on));
   }
 
   /**
@@ -650,7 +737,7 @@
     if (impl == null)
       throw new SocketException("Not connected");
 
-    Object buf = impl.getOption(SocketOptions.SO_RCVBUF);
+    Object buf = impl.getOption(SocketOptions.SO_KEEPALIVE);
 
     if (buf instanceof Boolean)
       return(((Boolean)buf).booleanValue());
Index: java/net/ServerSocket.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/java/net/ServerSocket.java,v
retrieving revision 1.12
diff -u -b -r1.12 ServerSocket.java
--- java/net/ServerSocket.java	27 Aug 2002 17:47:27 -0000	1.12
+++ java/net/ServerSocket.java	10 Sep 2002 18:40:15 -0000
@@ -152,13 +152,67 @@
   }
 
   /**
+   * Binds the server socket to a specified socket address
+   *
+   * @param endpoint The socket address to bind to
+   *
+   * @exception IOException If an error occurs
+   * 
+   * @since 1.4
+   */
+  public void bind (SocketAddress endpoint)
+    throws IOException
+  {
+    if (impl == null)
+      throw new IOException ("Cannot initialize Socket implementation");
+
+    InetSocketAddress tmp = (InetSocketAddress) endpoint;
+    
+    SecurityManager s = System.getSecurityManager ();
+    if (s != null)
+      s.checkListen (tmp.getPort ());
+
+    impl.bind (tmp.getAddress (), tmp.getPort ());
+  }
+ 
+  /**
+   * Binds the server socket to a specified socket address
+   *
+   * @param endpoint The socket address to bind to
+   * @param backlog The length of the pending connection queue
+   * @exception IOException If an error occurs
+   */
+  public void bind (SocketAddress endpoint, int backlog)
+    throws java.io.IOException 
+  {
+    if (impl == null)
+      throw new IOException ("Cannot initialize Socket implementation");
+
+    InetSocketAddress tmp = (InetSocketAddress) endpoint;
+    
+    SecurityManager s = System.getSecurityManager ();
+    if (s != null)
+      s.checkListen (tmp.getPort ());
+
+    impl.bind (tmp.getAddress (), tmp.getPort ());
+    impl.listen(backlog);
+  }
+  
+  /**
    * This method returns the local address to which this socket is bound
    *
    * @return The socket's local address
    */
   public InetAddress getInetAddress()
   {
-    return impl.getInetAddress();
+    try
+      {
+        return (InetAddress) impl.getOption (SocketOptions.SO_BINDADDR);
+      }
+    catch (SocketException e)
+      {
+        return null;
+      }
   }
 
   /**
@@ -172,6 +226,21 @@
   }
 
   /**
+   * Returns the local socket address
+   *
+   * @since 1.4
+   */
+  public SocketAddress getLocalSocketAddress()
+  {
+    InetAddress addr = getInetAddress();
+
+    if (addr != null)
+      return new InetSocketAddress (getInetAddress(), getLocalPort());
+
+    return null;
+  }
+
+  /**
    * Accepts a new connection and returns a connected <code>Socket</code> 
    * instance representing that connection.  This method will block until a 
    * connection is available.
@@ -255,13 +324,98 @@
   }
 
   /**
+   * Enables/Disables the SO_REUSEADDR option
+   * 
+   * @exception SocketException If an error occurs
+   * 
+   * @since 1.4
+   */
+  public void setReuseAddress (boolean on)
+    throws SocketException
+  {
+    if (impl == null)
+      throw new SocketException ("Cannot initialize Socket implementation");
+
+    impl.setOption (SocketOptions.SO_REUSEADDR, new Boolean (on));
+  }
+
+  /**
+   * Checks if the SO_REUSEADDR option is enabled
+   * 
+   * @exception SocketException If an error occurs
+   * 
+   * @since 1.4
+   */
+  public boolean getReuseAddress()
+    throws SocketException
+  {
+    if (impl == null)
+      throw new SocketException ("Cannot initialize Socket implementation");
+
+    Object reuseaddr = impl.getOption (SocketOptions.SO_REUSEADDR);
+
+    if (!(reuseaddr instanceof Boolean))
+      throw new SocketException ("Internal Error");
+    
+    return ((Boolean) reuseaddr).booleanValue ();
+  }
+
+  /**
+   * This method sets the value for the system level socket option
+   * SO_RCVBUF to the specified value.  Note that valid values for this
+   * option are specific to a given operating system.
+   * 
+   * @param size The new receive buffer size.
+   * 
+   * @exception SocketException If an error occurs or Socket is not connected
+   *
+   * @since 1.4
+   */
+  public void setReceiveBufferSize (int size)
+    throws SocketException
+  {
+    if (impl == null)
+      throw new SocketException ("Not connected");
+
+    if (size <= 0)
+      throw new IllegalArgumentException ("SO_RCVBUF value must be > 0");
+
+    impl.setOption (SocketOptions.SO_RCVBUF, new Integer (size));
+  }
+
+  /**
+   * This method returns the value of the system level socket option
+   * SO_RCVBUF, which is used by the operating system to tune buffer
+   * sizes for data transfers.
+   * 
+   * @return The receive buffer size.
+   *             
+   * @exception SocketException If an error occurs or Socket is not connected
+   * 
+   * @since 1.4
+   */
+  public int getReceiveBufferSize ()
+    throws SocketException
+  {
+    if (impl == null)
+      throw new SocketException ("Not connected");
+
+    Object buf = impl.getOption (SocketOptions.SO_RCVBUF);
+
+    if (!(buf instanceof Integer))
+      throw new SocketException ("Internal Error: Unexpected type");
+    
+    return ((Integer) buf).intValue ();
+  }
+
+  /**
    * Returns the value of this socket as a <code>String</code>. 
    *
    * @return This socket represented as a <code>String</code>.
    */
   public String toString ()
   {
-    return "ServerSocket " + impl.toString();
+    return "ServerSocket" + impl.toString();
   }
 
   // Class methods

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]