FileDocCategorySizeDatePackage
PlainDatagramSocketImpl.javaAPI DocJava SE 5 API10437Fri Aug 26 14:57:08 BST 2005java.net

PlainDatagramSocketImpl

public class PlainDatagramSocketImpl extends DatagramSocketImpl
Concrete datagram and multicast socket implementation base class. Note: This is not a public class, so that applets cannot call into the implementation directly and hence cannot bypass the security checks present in the DatagramSocket and MulticastSocket classes.
author
Pavani Diwanji

Fields Summary
private int
timeout
private int
trafficClass
private boolean
connected
private InetAddress
connectedAddress
private int
connectedPort
private int
multicastInterface
private boolean
loopbackMode
private int
ttl
private FileDescriptor
fd1
private int
fduse
private int
lastfd
private InetAddress
anyLocalBoundAddr
Constructors Summary
Methods Summary
protected synchronized voidbind(int lport, java.net.InetAddress laddr)
Binds a datagram socket to a local port.

	
	bind0(lport, laddr);
	if (laddr.isAnyLocalAddress()) {
	    anyLocalBoundAddr = laddr;
	}
    
protected native synchronized voidbind0(int lport, java.net.InetAddress laddr)

protected voidclose()
Close the socket.

	if (fd != null || fd1 != null) {
	    datagramSocketClose();
	    fd = null;
	    fd1 = null;
	}
    
protected voidconnect(java.net.InetAddress address, int port)
Connects a datagram socket to a remote destination. This associates the remote address with the local socket so that datagrams may only be sent to this destination and received from this destination.

param
address the remote InetAddress to connect to
param
port the remote port number

	connect0(address, port);
	connectedAddress = address;
	connectedPort = port;
	connected = true;
    
private native voidconnect0(java.net.InetAddress address, int port)

protected synchronized voidcreate()
Creates a datagram socket


              
     
	java.security.AccessController.doPrivileged(
		  new sun.security.action.LoadLibraryAction("net"));
	init();
    
	fd = new FileDescriptor();
	fd1 = new FileDescriptor();
	datagramSocketCreate();
    
private native voiddatagramSocketClose()

private native voiddatagramSocketCreate()

protected voiddisconnect()
Disconnects a previously connected socket. Does nothing if the socket was not connected already.

	disconnect0(connectedAddress.family);
	connected = false;
	connectedAddress = null;
	connectedPort = -1;
    
private native voiddisconnect0(int family)

protected voidfinalize()

	close();
    
public java.lang.ObjectgetOption(int optID)

        if (fd == null && fd1 == null) {
            throw new SocketException("Socket Closed");
        }

	Object result;

	switch (optID) {
	    case SO_TIMEOUT:
		result = new Integer(timeout);
		break;
	
	    case IP_TOS:
		result = socketGetOption(optID);
		if ( ((Integer)result).intValue() == -1) {
		    result = new Integer(trafficClass);
		}
		break;

	    case SO_BINDADDR:
		if (fd != null && fd1 != null) {
		    return anyLocalBoundAddr;	
		}
		/* fall through */
	    case IP_MULTICAST_IF:
	    case IP_MULTICAST_IF2:
	    case SO_RCVBUF:
	    case SO_SNDBUF:
	    case IP_MULTICAST_LOOP:
	    case SO_REUSEADDR:
	    case SO_BROADCAST:
		result = socketGetOption(optID);
		break;

	    default:
		throw new SocketException("invalid option: " + optID);
  	}

	return result;
    
protected native bytegetTTL()
Get the TTL (time-to-live) option.

protected native intgetTimeToLive()
Get the TTL (time-to-live) option.

private static native voidinit()
Perform class load-time initializations.

protected voidjoin(java.net.InetAddress inetaddr)
Join the multicast group.

param
multicast address to join.

	join(inetaddr, null);
    
private native voidjoin(java.net.InetAddress inetaddr, java.net.NetworkInterface netIf)

protected voidjoinGroup(java.net.SocketAddress mcastaddr, java.net.NetworkInterface netIf)
Join the multicast group.

param
multicast address to join.
param
netIf specifies the local interface to receive multicast datagram packets
throws
IllegalArgumentException if mcastaddr is null or is a SocketAddress subclass not supported by this socket
since
1.4

	if (mcastaddr == null || !(mcastaddr instanceof InetSocketAddress))
	    throw new IllegalArgumentException("Unsupported address type");
	join(((InetSocketAddress)mcastaddr).getAddress(), netIf);
    
protected voidleave(java.net.InetAddress inetaddr)
Leave the multicast group.

param
multicast address to leave.

	leave(inetaddr, null);
    
private native voidleave(java.net.InetAddress inetaddr, java.net.NetworkInterface netIf)

protected voidleaveGroup(java.net.SocketAddress mcastaddr, java.net.NetworkInterface netIf)
Leave the multicast group.

param
multicast address to leave.
param
netIf specified the local interface to leave the group at
throws
IllegalArgumentException if mcastaddr is null or is a SocketAddress subclass not supported by this socket
since
1.4

	if (mcastaddr == null || !(mcastaddr instanceof InetSocketAddress))
	    throw new IllegalArgumentException("Unsupported address type");
	leave(((InetSocketAddress)mcastaddr).getAddress(), netIf);
    
protected native synchronized intpeek(java.net.InetAddress i)
Peek at the packet to see who it is from.

param
return the address which the packet came from.

protected native synchronized intpeekData(java.net.DatagramPacket p)

protected synchronized voidreceive(java.net.DatagramPacket p)
Receive the datagram packet.

param
Packet Received.

	try {
	    receive0(p);
	} finally {
	    fduse = -1;
	}
    
protected native synchronized voidreceive0(java.net.DatagramPacket p)

protected native voidsend(java.net.DatagramPacket p)
Sends a datagram packet. The packet contains the data and the destination address to send the packet to.

param
packet to be sent.

public voidsetOption(int optID, java.lang.Object o)
set a value - since we only support (setting) binary options here, o must be a Boolean

         if (fd == null && fd1 == null) {
            throw new SocketException("Socket Closed");
         }
	 switch (optID) {
	    /* check type safety b4 going native.  These should never
	     * fail, since only java.Socket* has access to
	     * PlainSocketImpl.setOption().
	     */
	 case SO_TIMEOUT:
	     if (o == null || !(o instanceof Integer)) {
		 throw new SocketException("bad argument for SO_TIMEOUT");
	     }
	     int tmp = ((Integer) o).intValue();
	     if (tmp < 0)
		 throw new IllegalArgumentException("timeout < 0");
	     timeout = tmp;
	     return;
	 case IP_TOS:
	     if (o == null || !(o instanceof Integer)) {
		 throw new SocketException("bad argument for IP_TOS");
	     }
	     trafficClass = ((Integer)o).intValue();
	     break;
	 case SO_REUSEADDR:
	     if (o == null || !(o instanceof Boolean)) {
		 throw new SocketException("bad argument for SO_REUSEADDR");
	     }
	     break;
	 case SO_BROADCAST:
	     if (o == null || !(o instanceof Boolean)) {
		 throw new SocketException("bad argument for SO_BROADCAST");
	     }
	     break;
	 case SO_BINDADDR:
	     throw new SocketException("Cannot re-bind Socket");
	 case SO_RCVBUF:
	 case SO_SNDBUF:
	     if (o == null || !(o instanceof Integer) ||
		 ((Integer)o).intValue() < 0) {
		 throw new SocketException("bad argument for SO_SNDBUF or " +
					   "SO_RCVBUF");
	     }
	     break;
	 case IP_MULTICAST_IF:
	     if (o == null || !(o instanceof InetAddress))
		 throw new SocketException("bad argument for IP_MULTICAST_IF");
	     break;
	 case IP_MULTICAST_IF2:
	     if (o == null || !(o instanceof NetworkInterface))
		 throw new SocketException("bad argument for IP_MULTICAST_IF2");
	     break;
	 case IP_MULTICAST_LOOP:
	     if (o == null || !(o instanceof Boolean))
		 throw new SocketException("bad argument for IP_MULTICAST_LOOP");
	     break;
	 default:
	     throw new SocketException("invalid option: " + optID);
	 }
	 socketSetOption(optID, o);
     
protected native voidsetTTL(byte ttl)
Set the TTL (time-to-live) option.

param
TTL to be set.

protected native voidsetTimeToLive(int ttl)
Set the TTL (time-to-live) option.

param
TTL to be set.

private native java.lang.ObjectsocketGetOption(int opt)

private native voidsocketSetOption(int opt, java.lang.Object val)