mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			
		
			
				
	
	
		
			264 lines
		
	
	
		
			7.2 KiB
		
	
	
	
		
			Java
		
	
	
	
			
		
		
	
	
			264 lines
		
	
	
		
			7.2 KiB
		
	
	
	
		
			Java
		
	
	
	
| // Socket.java
 | |
| 
 | |
| /* Copyright (C) 1999  Free Software Foundation
 | |
| 
 | |
|    This file is part of libgcj.
 | |
| 
 | |
| This software is copyrighted work licensed under the terms of the
 | |
| Libgcj License.  Please consult the file "LIBGCJ_LICENSE" for
 | |
| details.  */
 | |
| 
 | |
| /**
 | |
|   * @author Per Bothner <bothner@cygnus.com>
 | |
|   * @date January 6, 1999.
 | |
|   */
 | |
| 
 | |
| /** Written using on-line Java Platform 1.2 API Specification.
 | |
|   * Status:  I believe all methods are implemented.
 | |
|   */
 | |
| 
 | |
| package java.net;
 | |
| import java.io.*;
 | |
| 
 | |
| public class Socket
 | |
| {
 | |
|   static SocketImplFactory factory;
 | |
|   SocketImpl impl;
 | |
| 
 | |
|   protected Socket ()
 | |
|   {
 | |
|   }
 | |
| 
 | |
|   protected Socket (SocketImpl impl) throws SocketException
 | |
|   {
 | |
|     this.impl = impl;
 | |
|   }
 | |
| 
 | |
|   public Socket (String host, int port)
 | |
|     throws UnknownHostException, IOException
 | |
|   {
 | |
|     this(factory == null ? new PlainSocketImpl() : factory.createSocketImpl());
 | |
|     SecurityManager s = System.getSecurityManager();
 | |
|     if (s != null)
 | |
|       s.checkConnect(host, port);
 | |
|     impl.create(true);
 | |
|     // FIXME: JCL p. 1586 says if localPort is unspecified, bind to any port,
 | |
|     // i.e. '0' and if localAddr is unspecified, use getLocalAddress() as
 | |
|     // that default.  JDK 1.2 doc infers not to do a bind.
 | |
|     impl.connect(host, port);
 | |
|   }
 | |
| 
 | |
|   public Socket (InetAddress address, int port)
 | |
|     throws IOException 
 | |
|   {
 | |
|     this(factory == null ? new PlainSocketImpl() : factory.createSocketImpl());
 | |
|     SecurityManager s = System.getSecurityManager();
 | |
|     if (s != null)
 | |
|       s.checkConnect(address.getHostName(), port);
 | |
|     impl.create(true);
 | |
|     // FIXME: JCL p. 1586 says if localPort is unspecified, bind to any port,
 | |
|     // i.e. '0' and if localAddr is unspecified, use getLocalAddress() as
 | |
|     // that default.  JDK 1.2 doc infers not to do a bind.
 | |
|     impl.connect(address, port);
 | |
|   }
 | |
| 
 | |
|   public Socket (String host, int port,
 | |
| 		 InetAddress localAddr, int localPort) throws IOException
 | |
|   {
 | |
|     this(factory == null ? new PlainSocketImpl() : factory.createSocketImpl());
 | |
|     SecurityManager s = System.getSecurityManager();
 | |
|     if (s != null)
 | |
|       s.checkConnect(host, port);
 | |
|     impl.create(true);
 | |
|     // FIXME: JCL p. 1587 says if localAddr is null, use getLocalAddress().
 | |
|     impl.bind(localAddr, localPort);
 | |
|     impl.connect(host, port);
 | |
|   }
 | |
| 
 | |
|   public Socket (InetAddress address, int port,
 | |
| 		 InetAddress localAddr, int localPort) throws IOException
 | |
|   {
 | |
|     this(factory == null ? new PlainSocketImpl() : factory.createSocketImpl());
 | |
|     SecurityManager s = System.getSecurityManager();
 | |
|     if (s != null)
 | |
|       s.checkConnect(address.getHostName(), port);
 | |
|     impl.create(true);
 | |
|     // FIXME: JCL p. 1587 says if localAddr is null, use getLocalAddress().
 | |
|     impl.bind(localAddr, localPort);
 | |
|     impl.connect(address, port);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @deprecated Use DatagramSocket instead for UDP transport.
 | |
|    */
 | |
|   public Socket (String host, int port, boolean stream) throws IOException
 | |
|   {
 | |
|     impl = factory == null ? new PlainSocketImpl()
 | |
|       : factory.createSocketImpl();
 | |
|     impl.create(stream);
 | |
|     SecurityManager s = System.getSecurityManager();
 | |
|     if (s != null)
 | |
|       s.checkConnect(host, port);
 | |
|     // FIXME: JCL p. 1586 says if localPort is unspecified, bind to any port,
 | |
|     // i.e. '0' and if localAddr is unspecified, use getLocalAddress() as
 | |
|     // that default.  JDK 1.2 doc infers not to do a bind.
 | |
|     impl.connect(host, port);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @deprecated Use DatagramSocket instead for UDP transport.
 | |
|    */
 | |
|   public Socket (InetAddress host, int port, boolean stream) throws IOException
 | |
|   {
 | |
|     impl = factory == null ? new PlainSocketImpl()
 | |
|       : factory.createSocketImpl();
 | |
|     impl.create(stream);
 | |
|     SecurityManager s = System.getSecurityManager();
 | |
|     if (s != null)
 | |
|       s.checkConnect(host.getHostName(), port);
 | |
|     // FIXME: JCL p. 1586 says if localPort is unspecified, bind to any port,
 | |
|     // i.e. '0' and if localAddr is unspecified, use getLocalAddress() as
 | |
|     // that default.  JDK 1.2 doc infers not to do a bind.
 | |
|     impl.connect(host, port);
 | |
|   }
 | |
| 
 | |
|   public InetAddress getInetAddress ()
 | |
|   {
 | |
|     return impl.getInetAddress();
 | |
|   }
 | |
| 
 | |
|   public InetAddress getLocalAddress ()
 | |
|   {
 | |
|     // FIXME: see note in DatagramSocket.java about checkConnect() and security
 | |
|     try
 | |
|       {
 | |
| 	return (InetAddress)impl.getOption(SocketOptions.SO_BINDADDR);
 | |
|       }
 | |
|     catch (SocketException x)
 | |
|       {
 | |
| 	// (hopefully) shouldn't happen
 | |
| 	System.err.println(x);
 | |
|         throw new java.lang.InternalError("Error in PlainSocketImpl.getOption");
 | |
|       }
 | |
|   }
 | |
| 
 | |
|   public int getPort ()
 | |
|   {
 | |
|     return impl.getPort();
 | |
|   }
 | |
| 
 | |
|   public int getLocalPort ()
 | |
|   {
 | |
|     return impl.getLocalPort();
 | |
|   }
 | |
| 
 | |
|   public InputStream getInputStream () throws IOException
 | |
|   {
 | |
|     return impl.getInputStream();
 | |
|   }
 | |
| 
 | |
|   public OutputStream getOutputStream () throws IOException
 | |
|   {
 | |
|     return impl.getOutputStream();
 | |
|   }
 | |
| 
 | |
|   public void setTcpNoDelay (boolean on)  throws SocketException
 | |
|   {
 | |
|     impl.setOption( SocketOptions.TCP_NODELAY, new Boolean(on) );
 | |
|   }
 | |
| 
 | |
|   public boolean getTcpNoDelay() throws SocketException
 | |
|   {
 | |
|     Boolean bool = (Boolean)impl.getOption( SocketOptions.TCP_NODELAY );
 | |
|     return bool.booleanValue();
 | |
|   }
 | |
| 
 | |
|   public void setSoLinger(boolean on, int linger) throws SocketException
 | |
|   {
 | |
|     if ( on && (linger >= 0) ) 
 | |
|       {
 | |
| 	if (linger > 65535)
 | |
| 	  linger = 65535;
 | |
| 	impl.setOption( SocketOptions.SO_LINGER, new Integer(linger) );
 | |
|       } 
 | |
|     else if ( on && (linger < 0) ) 
 | |
|       throw new IllegalArgumentException("SO_LINGER must be >= 0");
 | |
|     else
 | |
|       impl.setOption( SocketOptions.SO_LINGER, new Boolean(false) );
 | |
|   }
 | |
| 
 | |
|   public int getSoLinger() throws SocketException
 | |
|   {
 | |
|     Object linger = impl.getOption(SocketOptions.SO_LINGER);    
 | |
|     if (linger instanceof Integer) 
 | |
|       return ((Integer)linger).intValue();
 | |
|     else
 | |
|       return -1;
 | |
|   }
 | |
| 
 | |
|   public synchronized void setSoTimeout (int timeout) throws SocketException
 | |
|   {
 | |
|     if (timeout < 0)
 | |
|       throw new IllegalArgumentException("Invalid timeout: " + timeout);
 | |
| 
 | |
|     impl.setOption(SocketOptions.SO_TIMEOUT, new Integer(timeout));
 | |
|   }
 | |
| 
 | |
|   public synchronized int getSoTimeout () throws SocketException
 | |
|   {
 | |
|     Object timeout = impl.getOption(SocketOptions.SO_TIMEOUT);
 | |
|     if (timeout instanceof Integer) 
 | |
|       return ((Integer)timeout).intValue();
 | |
|     else
 | |
|       return 0;
 | |
|   }
 | |
| 
 | |
|   // JDK1.2
 | |
|   public void setSendBufferSize (int size) throws SocketException
 | |
|   {
 | |
|     if (size <= 0)
 | |
|       throw new IllegalArgumentException("Invalid buffer size: " + size);
 | |
| 
 | |
|     impl.setOption(SocketOptions.SO_SNDBUF, new Integer(size));
 | |
|   }
 | |
| 
 | |
|   // JDK1.2
 | |
|   public int getSendBufferSize () throws SocketException
 | |
|   {
 | |
|     Integer buf = (Integer)impl.getOption(SocketOptions.SO_SNDBUF);
 | |
|     return buf.intValue();
 | |
|   }
 | |
| 
 | |
|   // JDK1.2
 | |
|   public void setReceiveBufferSize (int size) throws SocketException
 | |
|   {
 | |
|     if (size <= 0)
 | |
|       throw new IllegalArgumentException("Invalid buffer size: " + size);
 | |
| 
 | |
|     impl.setOption(SocketOptions.SO_RCVBUF, new Integer(size));
 | |
|   }
 | |
| 
 | |
|   // JDK1.2
 | |
|   public int getReceiveBufferSize () throws SocketException
 | |
|   {
 | |
|     Integer buf = (Integer)impl.getOption(SocketOptions.SO_RCVBUF);
 | |
|     return buf.intValue();
 | |
|   }
 | |
| 
 | |
|   public synchronized void close ()  throws IOException
 | |
|   {
 | |
|     impl.close();
 | |
|   }
 | |
| 
 | |
|   public String toString ()
 | |
|   {
 | |
|     return "Socket" + impl.toString();
 | |
|   }
 | |
| 
 | |
|   public static synchronized void setSocketImplFactory (SocketImplFactory fac)
 | |
|     throws IOException
 | |
|   {
 | |
|     factory = fac;
 | |
|   }
 | |
| }
 |