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では現在、オプションを設定するための、型の安全性のある方法が提供されています。各ソケット・クラスは、そのクラスがサポートする各オプション用の取得および設定メソッドを持ち、適切な型のデータを受け取ったり返したりします。サポートされているオプション、適用されるソケット・クラス、およびその意味を、このあと簡単に説明します。

補足

Javaではサポートされていない、使用可能なBSDオプションは次のとおりです。

実装の詳細

SocketImpl/DatagramSocketImplをサブクラス化するとき以外は、この情報は必要ありません。すべての*Socketオブジェクトは、ネイティブ・コードへのインタフェースとなる、基礎になるSocketImpl/DatagramSocketImplを持っています。Implクラスは、オプションをサポートするための2つのメソッドを実装しています。
        void setOption(int optID, Object val) throws SocketException;
        Object getOption(int optID) throws SocketException;
これはCによく似ています。これらのメソッドは、ネイティブ・メソッドに対して接着剤のような働きをし、ネイティブ・メソッドを起動する前に型の安全性を保証します。

Copyright © 1993, 2020, Oracle and/or its affiliates. All rights reserved.