Java の Socket オプション

JDK 1.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 では現在、オプションを設定するときに型を保証する方法を提供しています。各ソケットクラスは、自分がサポートする各オプション用の取得および設定メソッドを持ち、適当な型を取得したり返したりします。ソケットクラスでサポートされるオプション、およびその意味を簡単に説明します。

さらに、JDK 1.1 は Socket、ServerSocket および DatagramSocket に対して新しいコンストラクタを提供することにより、このコンストラクタはソケットがバインドするローカルアドレスおよびローカルポートを設定することができ、同様に、クラスはこれらにそのローカルアドレスを公開できます。

JDK 1.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