使用中のブラウザでは JavaScript がサポートされていません。このページの機能をすべて使用するには、JavaScript のサポートが必要です。
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 によく似ています。
これらのメソッドは、ネイティブメソッドに対して接着剤のような働きをし、ネイティブメソッドを起動する前に型の安全性を保証します。