Java の Socket オプション
C の方法
 C でプログラミングする場合は、次のような方法でシステムコールを使用してオプションを設定します。 
	setsockopt(int fd, int level, int optval, void *optdata,
		   int optdatalen);
	fd = すでに開かれた (おそらく接続された) ソケット fd
	level = オプションが適用されるプロトコルスタック (IP, UDP, TCP) 
	        のレベル
	optval = オプション、CONSTANT
	optdata = オプションに依存するパラメータの構造体へのポインタ
	         (特定のオプションの場合のみ)
Java の方法
 オプションを設定する際の C の方法は、オブジェクト指向プログラミングの型の安全性を欠いています。 設定および取得したいオプションは int で指定し、設定および取得する値は、型がはっきりしない void* です。 間違ったオプション識別子を指定したり、void* パラメータに間違った型のオブジェクトを指定したり、そのパラメータに間違ったものを指定したりすることが、簡単に起こりえます。 さらに悪いことに、そのようなエラーのあるコードも通常はコンパイルされてしまい、エラーは実行時になって初めて表面化します。
Java では現在、オプションを設定するための、型の安全性のある方法が提供されています。 各ソケットクラスは、そのクラスがサポートする各オプション用の取得および設定メソッドを持ち、適切な型のデータを受け取ったり返したりします。 サポートされているオプション、適用されるソケットクラス、およびその意味を、このあと簡単に説明します。
- TCP_NODELAY
	- Nagle アルゴリズムを無効にする
	
 - (クライアント) Socket に対して有効
 
 - SO_LINGER
	- linger-on-close タイムアウトを指定する
	
 - (クライアント) Socket に対して有効
 
 - SO_TIMEOUT 
	- ソケット操作をブロックするタイムアウトを指定する  (永久にブロックしないこと)
	
 - すべてのソケット、つまり Socket、ServerSocket、および DatagramSocket に対して有効
 
 - SO_BINDADDR
	- ソケットのローカルアドレスバインディングをフェッチする
	
 - Socket、ServerSocket、および DatagramSocket に対して有効
 
 - SO_REUSEADDR
	- ソケットのアドレスの再利用を有効にする
	
 - Socket、ServerSocket、および DatagramSocket に対して有効
 
 - SO_BROADCAST
	- ブロードキャストメッセージを送信するソケットを有効にする
	
 - DatagramSocket に対して有効
 
 - SO_SNDBUF
	- 送出ネットワーク入出力に対して、基礎になるバッファのサイズを設定する
	
 - すべてのソケット、つまり Socket、ServerSocket、および DatagramSocket に対して有効
 
 - SO_RCVBUF
	- このソケットでデータを受信する際にプラットフォームで実際に使用されたバッファのサイズを取得する
	
 - すべてのソケット、つまり Socket、ServerSocket、および DatagramSocket に対して有効
 
 - SO_KEEPALIVE
	- ソケットのキープアライブをオンにする
        
 - Socket に対して有効
 
 - SO_OOBINLINE
	- TCP 緊急データのインライン受け付けを有効にする
	
 - Socket に対して有効
 
 - IP_MULTICAST_IF 
	- マルチキャストパケットに対して、送出インタフェースを指定する (マルチホームホスト上で)
	
 - MulticastSocket に対して有効
 
 - IP_MULTICAST_LOOP
	- マルチキャストデータグラムのローカルループバックを有効または無効にする
	
 - MulticastSocket に対して有効
 
 - IP_TOS
	- TCP または UDP ソケットの IP ヘッダ内のサービスタイプフィールドまたはトラフィッククラスフィールドを設定する
	
 - Socket、DatagramSocket に対して有効
 
 
補足
 Java ではサポートされていない、使用可能な BSD オプションは次のとおりです。
- RAW/ICMP SOCKETS:
 このオプションを使用する理由として、Java で ping を記述できるという点があるが、それによってセキュリティ上の問題が発生する可能性がある。 UNIX コンピュータ上の root でなければならない
 
実装の詳細
 SocketImpl/DatagramSocketImpl をサブクラス化するとき以外は、この情報は必要ありません。 すべての *Socket オブジェクトは、ネイティブコードへのインタフェースとなる、基礎になる SocketImpl/DatagramSocketImpl を持っています。 Impl クラスは、オプションをサポートするための 2 つのメソッドを実装しています。 
	void setOption(int optID, Object val) throws SocketException;
	Object getOption(int optID) throws SocketException;
 これは C によく似ています。これらのメソッドは、ネイティブメソッドに対して接着剤のような働きをし、ネイティブメソッドを起動する前に型の安全性を保証します。