1 /* Socket.java -- Client socket implementation
2 Copyright (C) 1998, 1999, 2000, 2002 Free Software Foundation, Inc.
4 This file is part of GNU Classpath.
6 GNU Classpath is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
11 GNU Classpath is distributed in the hope that it will be useful, but
12 WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with GNU Classpath; see the file COPYING. If not, write to the
18 Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
21 Linking this library statically or dynamically with other modules is
22 making a combined work based on this library. Thus, the terms and
23 conditions of the GNU General Public License cover the whole
26 As a special exception, the copyright holders of this library give you
27 permission to link this library with independent modules to produce an
28 executable, regardless of the license terms of these independent
29 modules, and to copy and distribute the resulting executable under
30 terms of your choice, provided that you also meet, for each linked
31 independent module, the terms and conditions of the license of that
32 module. An independent module is a module which is not derived from
33 or based on this library. If you modify this library, you may extend
34 this exception to your version of the library, but you are not
35 obligated to do so. If you do not wish to do so, delete this
36 exception statement from your version. */
41 import java
.nio
.channels
.SocketChannel
;
42 import java
.nio
.channels
.IllegalBlockingModeException
;
44 /* Written using on-line Java Platform 1.2 API Specification.
45 * Status: I believe all methods are implemented.
49 * This class models a client site socket. A socket is a TCP/IP endpoint
50 * for network communications conceptually similar to a file handle.
52 * This class does not actually do any work. Instead, it redirects all of
53 * its calls to a socket implementation object which implements the
54 * <code>SocketImpl</code> interface. The implementation class is
55 * instantiated by factory class that implements the
56 * <code>SocketImplFactory interface</code>. A default
57 * factory is provided, however the factory may be set by a call to
58 * the <code>setSocketImplFactory</code> method. Note that this may only be
59 * done once per virtual machine. If a subsequent attempt is made to set the
60 * factory, a <code>SocketException</code> will be thrown.
62 * @author Aaron M. Renn (arenn@urbanophile.com)
63 * @author Per Bothner (bothner@cygnus.com)
71 * This is the user SocketImplFactory for this class. If this variable is
72 * null, a default factory is used.
74 static SocketImplFactory factory
;
79 * The implementation object to which calls are redirected
83 private boolean inputShutdown
;
84 private boolean outputShutdown
;
86 SocketChannel ch
; // this field must have been set if created by SocketChannel
88 private boolean closed
= false;
93 * Initializes a new instance of <code>Socket</code> object without
94 * connecting to a remote host. This useful for subclasses of socket that
95 * might want this behavior.
97 * @specnote This constructor is public since JDK 1.4
103 impl
= factory
.createSocketImpl();
105 impl
= new PlainSocketImpl();
107 inputShutdown
= false;
108 outputShutdown
= false;
112 * Initializes a new instance of <code>Socket</code> object without
113 * connecting to a remote host. This is useful for subclasses of socket
114 * that might want this behavior.
116 * Additionally, this socket will be created using the supplied
117 * implementation class instead the default class or one returned by a
118 * factory. This value can be <code>null</code>, but if it is, all instance
119 * methods in <code>Socket</code> should be overridden because most of them
120 * rely on this value being populated.
122 * @param impl The <code>SocketImpl</code> to use for this
123 * <code>Socket</code>
125 * @exception SocketException If an error occurs
129 protected Socket (SocketImpl impl
) throws SocketException
132 this.inputShutdown
= false;
133 this.outputShutdown
= false;
137 * Initializes a new instance of <code>Socket</code> and connects to the
138 * hostname and port specified as arguments.
140 * @param host The name of the host to connect to
141 * @param port The port number to connect to
143 * @exception UnknownHostException If the hostname cannot be resolved to a
145 * @exception IOException If an error occurs
146 * @exception SecurityException If a security manager exists and its
147 * checkConnect method doesn't allow the operation
149 public Socket (String host
, int port
)
150 throws UnknownHostException
, IOException
152 this(InetAddress
.getByName(host
), port
, null, 0, true);
156 * Initializes a new instance of <code>Socket</code> and connects to the
157 * address and port number specified as arguments.
159 * @param address The address to connect to
160 * @param port The port number to connect to
162 * @exception IOException If an error occurs
163 * @exception SecurityException If a security manager exists and its
164 * checkConnect method doesn't allow the operation
166 public Socket (InetAddress address
, int port
)
169 this(address
, port
, null, 0, true);
173 * Initializes a new instance of <code>Socket</code> that connects to the
174 * named host on the specified port and binds to the specified local address
177 * @param host The name of the remote host to connect to.
178 * @param port The remote port to connect to.
179 * @param loadAddr The local address to bind to.
180 * @param localPort The local port to bind to.
182 * @exception SecurityException If the <code>SecurityManager</code>
183 * exists and does not allow a connection to the specified host/port or
184 * binding to the specified local host/port.
185 * @exception IOException If a connection error occurs.
189 public Socket (String host
, int port
,
190 InetAddress localAddr
, int localPort
) throws IOException
192 this(InetAddress
.getByName(host
), port
, localAddr
, localPort
, true);
196 * Initializes a new instance of <code>Socket</code> and connects to the
197 * address and port number specified as arguments, plus binds to the
198 * specified local address and port.
200 * @param address The remote address to connect to
201 * @param port The remote port to connect to
202 * @param localAddr The local address to connect to
203 * @param localPort The local port to connect to
205 * @exception IOException If an error occurs
206 * @exception SecurityException If a security manager exists and its
207 * checkConnect method doesn't allow the operation
211 public Socket (InetAddress address
, int port
,
212 InetAddress localAddr
, int localPort
) throws IOException
214 this(address
, port
, localAddr
, localPort
, true);
218 * Initializes a new instance of <code>Socket</code> and connects to the
219 * hostname and port specified as arguments. If the stream argument is set
220 * to <code>true</code>, then a stream socket is created. If it is
221 * <code>false</code>, a datagram socket is created.
223 * @param host The name of the host to connect to
224 * @param port The port to connect to
225 * @param stream <code>true</code> for a stream socket, <code>false</code>
226 * for a datagram socket
228 * @exception IOException If an error occurs
229 * @exception SecurityException If a security manager exists and its
230 * checkConnect method doesn't allow the operation
232 * @deprecated Use the <code>DatagramSocket</code> class to create
233 * datagram oriented sockets.
235 public Socket (String host
, int port
, boolean stream
) throws IOException
237 this(InetAddress
.getByName(host
), port
, null, 0, stream
);
241 * Initializes a new instance of <code>Socket</code> and connects to the
242 * address and port number specified as arguments. If the stream param is
243 * <code>true</code>, a stream socket will be created, otherwise a datagram
246 * @param host The address to connect to
247 * @param port The port number to connect to
248 * @param stream <code>true</code> to create a stream socket,
249 * <code>false</code> to create a datagram socket.
251 * @exception IOException If an error occurs
252 * @exception SecurityException If a security manager exists and its
253 * checkConnect method doesn't allow the operation
255 * @deprecated Use the <code>DatagramSocket</code> class to create
256 * datagram oriented sockets.
258 public Socket (InetAddress host
, int port
, boolean stream
) throws IOException
260 this(host
, port
, null, 0, stream
);
264 * This constructor is where the real work takes place. Connect to the
265 * specified address and port. Use default local values if not specified,
266 * otherwise use the local host and port passed in. Create as stream or
267 * datagram based on "stream" argument.
270 * @param raddr The remote address to connect to
271 * @param rport The remote port to connect to
272 * @param laddr The local address to connect to
273 * @param lport The local port to connect to
274 * @param stream true for a stream socket, false for a datagram socket
276 * @exception IOException If an error occurs
277 * @exception SecurityException If a security manager exists and its
278 * checkConnect method doesn't allow the operation
280 private Socket(InetAddress raddr
, int rport
, InetAddress laddr
, int lport
,
281 boolean stream
) throws IOException
286 throw new IOException("Cannot initialize Socket implementation");
288 SecurityManager sm
= System
.getSecurityManager();
290 sm
.checkConnect(raddr
.getHostName(), rport
);
292 // bind/connect socket
293 bind (new InetSocketAddress (laddr
, lport
));
294 connect (new InetSocketAddress (raddr
, rport
));
296 // FIXME: JCL p. 1586 says if localPort is unspecified, bind to any port,
297 // i.e. '0' and if localAddr is unspecified, use getLocalAddress() as
298 // that default. JDK 1.2 doc infers not to do a bind.
302 * Binds the socket to the givent local address/port
304 * @param bindpoint The address/port to bind to
306 * @exception IOException If an error occurs
307 * @exception SecurityException If a security manager exists and its
308 * checkConnect method doesn't allow the operation
309 * @exception IllegalArgumentException If the address type is not supported
313 public void bind (SocketAddress bindpoint
) throws IOException
316 throw new SocketException ("Socket is closed");
318 // XXX: JDK 1.4.1 API documentation says that if bindpoint is null the
319 // socket will be bound to an ephemeral port and a valid local address.
320 if (bindpoint
== null)
321 bindpoint
= new InetSocketAddress (InetAddress
.ANY_IF
, 0);
323 if ( !(bindpoint
instanceof InetSocketAddress
))
324 throw new IllegalArgumentException ();
326 InetSocketAddress tmp
= (InetSocketAddress
) bindpoint
;
331 // bind to address/port
334 impl
.bind (tmp
.getAddress(), tmp
.getPort());
336 catch (IOException exception
)
341 catch (RuntimeException exception
)
354 * Connects the socket with a remote address.
356 * @param endpoint The address to connect to
358 * @exception IOException If an error occurs
359 * @exception IllegalArgumentException If the addess type is not supported
360 * @exception IllegalBlockingModeException If this socket has an associated
361 * channel, and the channel is in non-blocking mode
365 public void connect (SocketAddress endpoint
)
368 connect (endpoint
, 0);
372 * Connects the socket with a remote address. A timeout of zero is
373 * interpreted as an infinite timeout. The connection will then block
374 * until established or an error occurs.
376 * @param endpoint The address to connect to
378 * @exception IOException If an error occurs
379 * @exception IllegalArgumentException If the address type is not supported
380 * @exception IllegalBlockingModeException If this socket has an associated
381 * channel, and the channel is in non-blocking mode
382 * @exception SocketTimeoutException If the timeout is reached
386 public void connect (SocketAddress endpoint
, int timeout
)
390 throw new SocketException ("Socket is closed");
392 if (! (endpoint
instanceof InetSocketAddress
))
393 throw new IllegalArgumentException ("Address type not supported");
395 if (ch
!= null && !ch
.isBlocking ())
396 throw new IllegalBlockingModeException ();
403 impl
.connect (endpoint
, timeout
);
405 catch (IOException exception
)
410 catch (RuntimeException exception
)
423 * Returns the address of the remote end of the socket. If this socket
424 * is not connected, then <code>null</code> is returned.
426 * @return The remote address this socket is connected to
428 public InetAddress
getInetAddress ()
431 return impl
.getInetAddress();
437 * Returns the local address to which this socket is bound. If this socket
438 * is not connected, then <code>null</code> is returned.
440 * @return The local address
444 public InetAddress
getLocalAddress ()
449 InetAddress addr
= null;
452 addr
= (InetAddress
)impl
.getOption(SocketOptions
.SO_BINDADDR
);
454 catch(SocketException e
)
456 // (hopefully) shouldn't happen
457 // throw new java.lang.InternalError
458 // ("Error in PlainSocketImpl.getOption");
462 // FIXME: According to libgcj, checkConnect() is supposed to be called
463 // before performing this operation. Problems: 1) We don't have the
464 // addr until after we do it, so we do a post check. 2). The docs I
465 // see don't require this in the Socket case, only DatagramSocket, but
466 // we'll assume they mean both.
467 SecurityManager sm
= System
.getSecurityManager();
469 sm
.checkConnect(addr
.getHostName(), getLocalPort());
475 * Returns the port number of the remote end of the socket connection. If
476 * this socket is not connected, then -1 is returned.
478 * @return The remote port this socket is connected to
480 public int getPort ()
483 return impl
.getPort();
489 * Returns the local port number to which this socket is bound. If this
490 * socket is not connected, then -1 is returned.
492 * @return The local port
494 public int getLocalPort ()
497 return impl
.getLocalPort();
503 * If the socket is already bound this returns the local SocketAddress,
508 public SocketAddress
getLocalSocketAddress()
510 InetAddress addr
= getLocalAddress ();
515 return new InetSocketAddress (addr
, impl
.getLocalPort());
519 * If the socket is already connected this returns the remote SocketAddress,
524 public SocketAddress
getRemoteSocketAddress()
529 return new InetSocketAddress (impl
.getInetAddress (), impl
.getPort ());
533 * Returns an InputStream for reading from this socket.
535 * @return The InputStream object
537 * @exception IOException If an error occurs or Socket is not connected
539 public InputStream
getInputStream () throws IOException
542 return(impl
.getInputStream());
544 throw new IOException("Not connected");
548 * Returns an OutputStream for writing to this socket.
550 * @return The OutputStream object
552 * @exception IOException If an error occurs or Socket is not connected
554 public OutputStream
getOutputStream () throws IOException
557 return impl
.getOutputStream();
559 throw new IOException("Not connected");
563 * Sets the TCP_NODELAY option on the socket.
565 * @param on true to enable, false to disable
567 * @exception SocketException If an error occurs or Socket is not connected
571 public void setTcpNoDelay (boolean on
) throws SocketException
574 throw new SocketException("Not connected");
576 impl
.setOption(SocketOptions
.TCP_NODELAY
, new Boolean(on
));
580 * Tests whether or not the TCP_NODELAY option is set on the socket.
581 * Returns true if enabled, false if disabled. When on it disables the
582 * Nagle algorithm which means that packets are always send immediatly and
583 * never merged together to reduce network trafic.
585 * @return Whether or not TCP_NODELAY is set
587 * @exception SocketException If an error occurs or Socket not connected
591 public boolean getTcpNoDelay() throws SocketException
594 throw new SocketException("Not connected");
596 Object on
= impl
.getOption(SocketOptions
.TCP_NODELAY
);
598 if (on
instanceof Boolean
)
599 return(((Boolean
)on
).booleanValue());
601 throw new SocketException("Internal Error");
605 * Sets the value of the SO_LINGER option on the socket. If the
606 * SO_LINGER option is set on a socket and there is still data waiting to
607 * be sent when the socket is closed, then the close operation will block
608 * until either that data is delivered or until the timeout period
609 * expires. The linger interval is specified in hundreths of a second
610 * (platform specific?)
612 * @param on true to enable SO_LINGER, false to disable
613 * @param linger The SO_LINGER timeout in hundreths of a second or -1 if
616 * @exception SocketException If an error occurs or Socket not connected
617 * @exception IllegalArgumentException If linger is negative
621 public void setSoLinger(boolean on
, int linger
) throws SocketException
624 throw new SocketException("No socket created");
629 throw new IllegalArgumentException("SO_LINGER must be >= 0");
634 impl
.setOption(SocketOptions
.SO_LINGER
, new Integer(linger
));
638 impl
.setOption(SocketOptions
.SO_LINGER
, new Boolean(false));
643 * Returns the value of the SO_LINGER option on the socket. If the
644 * SO_LINGER option is set on a socket and there is still data waiting to
645 * be sent when the socket is closed, then the close operation will block
646 * until either that data is delivered or until the timeout period
647 * expires. This method either returns the timeouts (in hundredths of
648 * of a second (platform specific?)) if SO_LINGER is set, or -1 if
649 * SO_LINGER is not set.
651 * @return The SO_LINGER timeout in hundreths of a second or -1
652 * if SO_LINGER not set
654 * @exception SocketException If an error occurs or Socket is not connected
658 public int getSoLinger() throws SocketException
661 throw new SocketException("Not connected");
663 Object linger
= impl
.getOption(SocketOptions
.SO_LINGER
);
664 if (linger
instanceof Integer
)
665 return(((Integer
)linger
).intValue());
671 * Sends urgent data through the socket
673 * @param data The data to send.
674 * Only the lowest eight bits of data are sent
676 * @exception IOException If an error occurs
680 public void sendUrgentData (int data
) throws IOException
682 impl
.sendUrgentData (data
);
686 * Enables/disables the SO_OOBINLINE option
688 * @param on True if SO_OOBLINE should be enabled
690 * @exception SocketException If an error occurs
694 public void setOOBInline (boolean on
) throws SocketException
697 throw new SocketException("Not connected");
699 impl
.setOption(SocketOptions
.SO_OOBINLINE
, new Boolean(on
));
703 * Returns the current setting of the SO_OOBINLINE option for this socket
705 * @exception SocketException If an error occurs
709 public boolean getOOBInline () throws SocketException
712 throw new SocketException("Not connected");
714 Object buf
= impl
.getOption(SocketOptions
.SO_OOBINLINE
);
716 if (buf
instanceof Boolean
)
717 return(((Boolean
)buf
).booleanValue());
719 throw new SocketException("Internal Error: Unexpected type");
723 * Sets the value of the SO_TIMEOUT option on the socket. If this value
724 * is set, and an read/write is performed that does not complete within
725 * the timeout period, a short count is returned (or an EWOULDBLOCK signal
726 * would be sent in Unix if no data had been read). A value of 0 for
727 * this option implies that there is no timeout (ie, operations will
728 * block forever). On systems that have separate read and write timeout
729 * values, this method returns the read timeout. This
730 * value is in milliseconds.
732 * @param timeout The length of the timeout in milliseconds, or
733 * 0 to indicate no timeout.
735 * @exception SocketException If an error occurs or Socket not connected
739 public synchronized void setSoTimeout (int timeout
) throws SocketException
742 throw new SocketException("Not connected");
745 throw new IllegalArgumentException("SO_TIMEOUT value must be >= 0");
747 impl
.setOption(SocketOptions
.SO_TIMEOUT
, new Integer(timeout
));
751 * Returns the value of the SO_TIMEOUT option on the socket. If this value
752 * is set, and an read/write is performed that does not complete within
753 * the timeout period, a short count is returned (or an EWOULDBLOCK signal
754 * would be sent in Unix if no data had been read). A value of 0 for
755 * this option implies that there is no timeout (ie, operations will
756 * block forever). On systems that have separate read and write timeout
757 * values, this method returns the read timeout. This
758 * value is in thousandths of a second (implementation specific?).
760 * @return The length of the timeout in thousandth's of a second or 0
763 * @exception SocketException If an error occurs or Socket not connected
767 public synchronized int getSoTimeout () throws SocketException
770 throw new SocketException("Not connected");
772 Object timeout
= impl
.getOption(SocketOptions
.SO_TIMEOUT
);
773 if (timeout
instanceof Integer
)
774 return(((Integer
)timeout
).intValue());
780 * This method sets the value for the system level socket option
781 * SO_SNDBUF to the specified value. Note that valid values for this
782 * option are specific to a given operating system.
784 * @param size The new send buffer size.
786 * @exception SocketException If an error occurs or Socket not connected
787 * @exception IllegalArgumentException If size is 0 or negative
791 public void setSendBufferSize (int size
) throws SocketException
794 throw new SocketException("Not connected");
797 throw new IllegalArgumentException("SO_SNDBUF value must be > 0");
799 impl
.setOption(SocketOptions
.SO_SNDBUF
, new Integer(size
));
803 * This method returns the value of the system level socket option
804 * SO_SNDBUF, which is used by the operating system to tune buffer
805 * sizes for data transfers.
807 * @return The send buffer size.
809 * @exception SocketException If an error occurs or socket not connected
813 public int getSendBufferSize () throws SocketException
816 throw new SocketException("Not connected");
818 Object buf
= impl
.getOption(SocketOptions
.SO_SNDBUF
);
820 if (buf
instanceof Integer
)
821 return(((Integer
)buf
).intValue());
823 throw new SocketException("Internal Error: Unexpected type");
827 * This method sets the value for the system level socket option
828 * SO_RCVBUF to the specified value. Note that valid values for this
829 * option are specific to a given operating system.
831 * @param size The new receive buffer size.
833 * @exception SocketException If an error occurs or Socket is not connected
834 * @exception IllegalArgumentException If size is 0 or negative
838 public void setReceiveBufferSize (int size
) throws SocketException
841 throw new SocketException("Not connected");
844 throw new IllegalArgumentException("SO_RCVBUF value must be > 0");
846 impl
.setOption(SocketOptions
.SO_RCVBUF
, new Integer(size
));
850 * This method returns the value of the system level socket option
851 * SO_RCVBUF, which is used by the operating system to tune buffer
852 * sizes for data transfers.
854 * @return The receive buffer size.
856 * @exception SocketException If an error occurs or Socket is not connected
860 public int getReceiveBufferSize () throws SocketException
863 throw new SocketException("Not connected");
865 Object buf
= impl
.getOption(SocketOptions
.SO_RCVBUF
);
867 if (buf
instanceof Integer
)
868 return(((Integer
)buf
).intValue());
870 throw new SocketException("Internal Error: Unexpected type");
874 * This method sets the value for the socket level socket option
877 * @param on True if SO_KEEPALIVE should be enabled
879 * @exception SocketException If an error occurs or Socket is not connected
883 public void setKeepAlive (boolean on
) throws SocketException
886 throw new SocketException("Not connected");
888 impl
.setOption(SocketOptions
.SO_KEEPALIVE
, new Boolean(on
));
892 * This method returns the value of the socket level socket option
895 * @return The setting
897 * @exception SocketException If an error occurs or Socket is not connected
901 public boolean getKeepAlive () throws SocketException
904 throw new SocketException("Not connected");
906 Object buf
= impl
.getOption(SocketOptions
.SO_KEEPALIVE
);
908 if (buf
instanceof Boolean
)
909 return(((Boolean
)buf
).booleanValue());
911 throw new SocketException("Internal Error: Unexpected type");
917 * @exception IOException If an error occurs
919 public synchronized void close () throws IOException
931 * Converts this <code>Socket</code> to a <code>String</code>.
933 * @return The <code>String</code> representation of this <code>Socket</code>
935 public String
toString ()
937 return("Socket " + impl
);
943 * Sets the <code>SocketImplFactory</code>. This may be done only once per
944 * virtual machine. Subsequent attempts will generate a
945 * <code>SocketException</code>. Note that a <code>SecurityManager</code>
946 * check is made prior to setting the factory. If
947 * insufficient privileges exist to set the factory, then an
948 * <code>IOException</code> will be thrown.
950 * @exception SecurityException If the <code>SecurityManager</code> does
951 * not allow this operation.
952 * @exception SocketException If the SocketImplFactory is already defined
953 * @exception IOException If any other error occurs
955 public static synchronized void setSocketImplFactory (SocketImplFactory fac
)
958 // See if already set
960 throw new SocketException("SocketImplFactory already defined");
963 SecurityManager sm
= System
.getSecurityManager();
965 sm
.checkSetFactory();
968 throw new SocketException("SocketImplFactory cannot be null");
974 * Closes the input side of the socket stream.
976 * @exception IOException If an error occurs.
980 public void shutdownInput() throws IOException
983 impl
.shutdownInput();
985 inputShutdown
= true;
989 * Closes the output side of the socket stream.
991 * @exception IOException If an error occurs.
995 public void shutdownOutput() throws IOException
998 impl
.shutdownOutput();
1000 outputShutdown
= true;
1004 * Returns the socket channel associated with this socket.
1006 * It returns null if no associated socket exists.
1010 public SocketChannel
getChannel()
1016 * Checks if the SO_REUSEADDR option is enabled
1018 * @exception SocketException If an error occurs
1022 public boolean getReuseAddress () throws SocketException
1025 throw new SocketException ("Cannot initialize Socket implementation");
1027 Object reuseaddr
= impl
.getOption (SocketOptions
.SO_REUSEADDR
);
1029 if (!(reuseaddr
instanceof Boolean
))
1030 throw new SocketException ("Internal Error");
1032 return ((Boolean
) reuseaddr
).booleanValue ();
1036 * Enables/Disables the SO_REUSEADDR option
1038 * @exception SocketException If an error occurs
1042 public void setReuseAddress (boolean on
) throws SocketException
1045 throw new SocketException ("Cannot initialize Socket implementation");
1047 impl
.setOption (SocketOptions
.SO_REUSEADDR
, new Boolean (on
));
1051 * Returns the current traffic class
1053 * @exception SocketException If an error occurs
1055 * @see Socket#setTrafficClass(int tc)
1059 public int getTrafficClass () throws SocketException
1062 throw new SocketException ("Cannot initialize Socket implementation");
1064 Object obj
= impl
.getOption(SocketOptions
.IP_TOS
);
1066 if (obj
instanceof Integer
)
1067 return ((Integer
) obj
).intValue ();
1069 throw new SocketException ("Unexpected type");
1073 * Sets the traffic class value
1075 * @param tc The traffic class
1077 * @exception SocketException If an error occurs
1078 * @exception IllegalArgumentException If tc value is illegal
1080 * @see Socket#getTrafficClass()
1084 public void setTrafficClass (int tc
) throws SocketException
1087 throw new SocketException ("Cannot initialize Socket implementation");
1089 if (tc
< 0 || tc
> 255)
1090 throw new IllegalArgumentException();
1092 impl
.setOption (SocketOptions
.IP_TOS
, new Integer (tc
));
1096 * Checks if the socket is connected
1100 public boolean isConnected ()
1102 return impl
.getInetAddress () != null;
1106 * Checks if the socket is already bound.
1110 public boolean isBound ()
1112 return getLocalAddress () != null;
1116 * Checks if the socket is closed.
1120 public boolean isClosed ()
1126 * Checks if the socket's input stream is shutdown
1130 public boolean isInputShutdown ()
1132 return inputShutdown
;
1136 * Checks if the socket's output stream is shutdown
1140 public boolean isOutputShutdown ()
1142 return outputShutdown
;