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 は現在オプションをセットするとき型を保護する方法を提供します。各ソケットク
ラスは、自分がサポートする各オプション用の取得/設定メソッドを持ち、適当な型を取得したり返したりします。サポートされるオプション、そのソケットクラスと意味を簡略に述べます:
- TCP_NODELAY
- Nagle アルゴリズムを使用不可にする。
- (クライアント) Sockets に対して有効。
- SO_LINGER
- linger-on-close タイムアウトを指定する。
- (クライアント) Sockets に対して有効。
- SO_TIMEOUT
- ソケット操作をブロックするタイムアウトを指定する。(永久にブロックしないこと。)
- すべてのソケットに有効: Socket、ServerSocket、DatagramSocket。
- IP_MULTICAST_IF
- マルチキャストパケットに対して送出するインタフェースを指定する (マルチホームホスト上で)。
- MulticastSockets に対して有効。
さらに、JDK1.1 は Socket、ServerSocket および DatagramSocket に対して新しい構築子を提供し、この構築子はソケットがバインドするローカルアドレス/ポートの仕様設定を許し、同様にこれらにクラスはそのローカルアドレスを公開できます。
JDK1.1 のソケットクラスに対して、すべてのオプションの取得/設定の方法の詳細を含めて、完全な javadoc をここに提供します。java で使用したい他のオプションがあれば、連絡してください。
横道にそれて...
java でサポートされていないいくつかの可能な BSD オプションは次のとおりで
す:
- SO_KEEPALIVE:
このオプションに関して、OS は繰り返し接続ピアに ping しそれがそこにあることを確
認する。これに関する月並みな知恵としては、アプリケーションレベルでこの機能を一番うまく処理できるということである。ホスト要件の RFC は 2 時間の ping 間隔を指定し、これは実際上は有用ではない。
- MSG_OOB:
これは、帯域内データの前に帯域外または「至急」とマークされたデータを存在すれば読み込むために、実際ソケット上の read() または recv() に渡すオプションである。これを含める場合、オプション SO_OOBINLINE (下記) もまた含める必要があるが、これが必要とも思われない。このことに対する本当の複雑さは、OOB データを書き込む対称的な方法を提供する必要があるということであるが、これも要求されていない。
- SO_OOBINLINE:
このオプションは OOB データをインラインにし、それを「通常の」データのようにインラインに表示する。これは MSG_OOB と連携して動作する。
- 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 に似ています。これらのメソッドはネイティブメソッドに対して糊のよう
な働きをし、ネイティブメソッドを起動する前に型の安全を保証します。
brown@monkey.eng.sun.com