Java の Socket オプション

JDK1.1 のソケットクラスの javadoc はここに あります。

C の方法

C でプログラミングするとき、次の行にシステム呼び出しを使用してオプションをセットします:
	setsockopt(int fd, int level, int optval, void *optdata, 
		   int optdatalen);

	fd = 既に開かれた (多分接続された) ソケット fd;
	level = オプションが適用されるプロトコルスタック (IP, UDP, TCP) のレベル;
	optval = オプション、CONSTANT;
	optdata = 特定のオプションにだけ関係するパラメータのオプション依存 sturuct への ptr;

java の方法

C でのオプションセットの方法は、オブジェクト指向プログラミングの型の安全性を欠いています。セット/取得したいオプションは int として識別され、認定/取得する値は型がはっきりしない void* に入ります。間違ったオプション識別し、void* パラメータの間違った型のオブジェクト、またはそのパラメータに対して間違ったものを渡すことは全く簡単です。さらに悪いことには、これらエラーのコードは通常コンパイルされ、エラーは実行時にだけ表示されます。

Java は現在オプションをセットするとき型を保護する方法を提供します。各ソケットク ラスは、自分がサポートする各オプション用の取得/設定メソッドを持ち、適当な型を取得したり返したりします。サポートされるオプション、そのソケットクラスと意味を簡略に述べます:

さらに、JDK1.1 は Socket、ServerSocket および DatagramSocket に対して新しい構築子を提供し、この構築子はソケットがバインドするローカルアドレス/ポートの仕様設定を許し、同様にこれらにクラスはそのローカルアドレスを公開できます。

JDK1.1 のソケットクラスに対して、すべてのオプションの取得/設定の方法の詳細を含めて、完全な javadoc をここに提供します。java で使用したい他のオプションがあれば、連絡してください。

横道にそれて...

java でサポートされていないいくつかの可能な BSD オプションは次のとおりで す:

実装の詳細...

...サブクラスが SocketImpl/DatagramSocketImpl でなければ、これは知る必要がありません。すべての *Socket オブジェクトはネイティブコードとのインタフェースとなる内在する SocketImpl/DatagramSocketImpl を持っています。Impl クラスは2つのメソッドを実装しオプションをサポートします。
	void setOption(int optID, Object val) throws SocketException;
	Object getOption(int optID) throws SocketException ;
これは大変 C に似ています。これらのメソッドはネイティブメソッドに対して糊のよう な働きをし、ネイティブメソッドを起動する前に型の安全を保証します。


brown@monkey.eng.sun.com