JavaのSocketオプション
Cの方法
Cでプログラミングする場合は、次のような方法でシステム・コールを使用してオプションを設定します。
setsockopt(int fd, int level, int optval, void *optdata,
int optdatalen);
fd = already opened (possibly connected) socket fd;
level = level in the protocol stack (IP, UDP, TCP) where
the option applies;
optval = the option, a CONSTANT;
optdata = ptr to option dependent struct of parameters relevant
only to a particular option;
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によく似ています。これらのメソッドは、ネイティブ・メソッドに対して接着剤のような働きをし、ネイティブ・メソッドを起動する前に型の安全性を保証します。