datagramsocket.java

来自「gcc3.2.1源代码」· Java 代码 · 共 263 行

JAVA
263
字号
// DatagramSocket.java/* Copyright (C) 1999, 2000  Free Software Foundation   This file is part of libgcj.This software is copyrighted work licensed under the terms of theLibgcj License.  Please consult the file "LIBGCJ_LICENSE" fordetails.  */package java.net;import java.io.IOException;/** * @author Warren Levy <warrenl@cygnus.com> * @date May 3, 1999. *//** * Written using on-line Java Platform 1.2 API Specification, as well * as "The Java Class Libraries", 2nd edition (Addison-Wesley, 1998). * Status:  Believed complete and correct. */public class DatagramSocket{  DatagramSocketImpl impl;  public DatagramSocket() throws SocketException  {    this(0, null);  }  public DatagramSocket(int port) throws SocketException  {    this(port, null);  }  public DatagramSocket(int port, InetAddress laddr) throws SocketException  {    if (port < 0 || port > 65535)      throw new IllegalArgumentException("Invalid port: " + port);    SecurityManager s = System.getSecurityManager();    if (s != null)      s.checkListen(port);    String propVal = System.getProperty("impl.prefix");    if (propVal == null || propVal.equals(""))      impl = new PlainDatagramSocketImpl();    else      try	{	  impl = (DatagramSocketImpl) Class.forName("java.net." + propVal +					"DatagramSocketImpl").newInstance();	}      catch (Exception e)	{	  System.err.println("Could not instantiate class: java.net." +	    propVal + "DatagramSocketImpl");	  impl = new PlainDatagramSocketImpl();	}    impl.create();    // For multicasting, set the socket to be reused (Stevens pp. 195-6).    if (this instanceof MulticastSocket)      impl.setOption(SocketOptions.SO_REUSEADDR, new Boolean(true));    impl.bind(port, laddr == null ? InetAddress.ANY_IF : laddr);  }  public void close()  {    impl.close();  }  public InetAddress getLocalAddress()  {    SecurityManager s = System.getSecurityManager();    // FIXME: JCL p. 510 says this should call checkConnect.  But what    // string should be used as the hostname?  Maybe this is just a side    // effect of calling InetAddress.getLocalHost.    //    // And is getOption with SO_BINDADDR the right way to get the address?    // Doesn't seem to be since this method doesn't throw a SocketException    // and SO_BINADDR can throw one.    //    // Also see RETURNS section in JCL p. 510 about returning any local    // addr "if the current execution context is not allowed to connect to    // the network interface that is actually bound to this datagram socket."    // How is that done?  via InetAddress.getLocalHost?  But that throws    // an UnknownHostException and this method doesn't.    //    // if (s != null)    //   s.checkConnect("localhost", -1);    try      {	return (InetAddress)impl.getOption(SocketOptions.SO_BINDADDR);      }    catch (SocketException ex)      {      }    try      {	return InetAddress.getLocalHost();      }    catch (UnknownHostException ex)      {	// FIXME: This should never happen, so how can we avoid this construct?	return null;      }  }  public int getLocalPort()  {    return impl.getLocalPort();  }  public synchronized int getSoTimeout() throws SocketException  {    Object timeout = impl.getOption(SocketOptions.SO_TIMEOUT);    if (timeout instanceof Integer)       return ((Integer)timeout).intValue();    else      return 0;  }  public synchronized void receive(DatagramPacket p) throws IOException  {    SecurityManager s = System.getSecurityManager();    if (s != null)      s.checkAccept(p.getAddress().getHostAddress(), p.getPort());    impl.receive(p);  }  public void send(DatagramPacket p) throws IOException  {    // JDK1.2: Don't do security checks if socket is connected; see jdk1.2 api.    SecurityManager s = System.getSecurityManager();    if (s != null)      {	InetAddress addr = p.getAddress();	if (addr.isMulticastAddress())	  s.checkMulticast(addr);	else	  s.checkConnect(addr.getHostAddress(), p.getPort());      }    // FIXME: if this is a subclass of MulticastSocket, use getTTL for TTL val.    impl.send(p);  }  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));  }  // JDK1.2  // public void connect(InetAddress address, int port)  // {  // }  // JDK1.2  // public void disconnect()  // {  // }  // JDK1.2  // public InetAddress getInetAddress()  // {  // }  // JDK1.2  // public int getPort()  // {  // }  /**   * 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.   *   * @since 1.2   */  public int getReceiveBufferSize() throws SocketException  {    Object obj = impl.getOption(SocketOptions.SO_RCVBUF);      if (obj instanceof Integer)      return(((Integer)obj).intValue());    else       throw new SocketException("Unexpected type");  }  /**   * This method returns the value of the system level socket option   * SO_SNDBUF, which is used by the operating system to tune buffer   * sizes for data transfers.   *   * @return The send buffer size.   *   * @exception SocketException If an error occurs.   *   * @since 1.2   */  public int getSendBufferSize() throws SocketException  {    Object obj = impl.getOption(SocketOptions.SO_SNDBUF);    if (obj instanceof Integer)      return(((Integer)obj).intValue());    else      throw new SocketException("Unexpected type");  }  /**   * 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.   *     * @since 1.2   */  public void setReceiveBufferSize(int size) throws SocketException  {    if (size < 0)      throw new IllegalArgumentException("Buffer size is less than 0");    impl.setOption(SocketOptions.SO_RCVBUF, new Integer(size));  }  /**   * This method sets the value for the system level socket option   * SO_SNDBUF to the specified value.  Note that valid values for this   * option are specific to a given operating system.   *   * @param size The new send buffer size.   *   * @exception SocketException If an error occurs.   *   * @since 1.2   */  public void setSendBufferSize(int size) throws SocketException  {    if (size < 0)      throw new IllegalArgumentException("Buffer size is less than 0");      impl.setOption(SocketOptions.SO_SNDBUF, new Integer(size));  }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?