setsockopt()

setsockopt() 呼び出しは、ソケットに関連付けられるオプションを設定します。 これを呼び出すことができるのは、AF_INET ドメインのソケットの場合だけです。 オプションは、複数のプロトコル・レベルに存在することができますが、ソケット・レベルについては常に最高のレベルに存在します。

ソケット・オプションの操作時には、当該のオプションが常駐するレベルと そのオプションの名前を指定する必要があります。 そのソケット・レベルでオプションを操作するためには、SOCKET.H 内で定義されてい る SOL_SOCKET を level パラメーターに設定しなければなりません。 TCP レベルでオプションを操作するには、level パラメーターを、SOCKET.H で 定義されている IPPROTO_TCP に設定しなければなりません。 IP レベルなどのほかの任意のレベルでオプションを操作するには、 そのオプションを制御するプロトコルの該当プロトコル番号を指定してください。 現在、SOL_SOCKET、IPPROTO_TCP、および、IPPROTO_IP の各レベルがサポートされています。 getprotobyname() 呼び出しを 使用すると、名前で指定したプロトコルのプロトコル番号を戻させることができます。

#include <manifest.h>
#include <bsdtypes.h>
#include <socket.h>
 
int setsockopt(int s, int level, int optname, char *optval, int optlen)
パラメーター
説明
s
ソケット記述子
level
オプションを設定するレベル
optname
指定されたソケット・オプションの名前。 optname の数値については、GETSOCKOPT/SETSOCKOPT コマンド値を参照してください。
optval
オプショナル・データへのポインター
optlen
オプショナル・データの長さ

パラメーター optval および optlen は、特定の set コマンドが 使用するデータを渡すために使用します。optval パラメーターは、当該の set コマンドが必要とするデータを含むバッファーを示します。 optlen パラメーターには optval がポイントしているデータのサイズを 設定する必要が あります。

SO_LINGER 以外のすべてのソケット・レベル・オプションは、 optval が整数をポイントしていることおよび optlen に 設定されているサイズが整数であることを予期しています。 その整数が 0 以外である場合、オプションは使用可能です。トグル・タイプ・オプションの場合、このオプションは その整数が 0 以外である場合は使用可能になります。0 の場合は使用不可になります。 SO_LINGER オプションは、SOCKET.H 内の定義に従って optvalリンガー構造体をポイントすることを予期しています。この構造体は、以下の例のように定義されます。
struct  linger
{
        int     l_onoff;                /* option on/off */
        int     l_linger;               /* linger time */
};

SO_LINGER オプションが使用不可になっている場合は、l_onoff フィールドに は 0 が設定されます。非ゼロ値はオプションを使用可能にします。 l_linger フィールドには、クローズ時におけるリンガー時間の総数を指定します。 l_linger の単位は、秒です。

TCP レベルで認識されるオプションを以下に示します。
オプション
説明
TCP_NODELAY
ソケットを介して送信されたすべてのデータについて、Nagle アルゴリズム (RFC 896) の使用を切り替えます。 このオプションは AF_IUCV ソケットではサポートされていません。 ほとんどの環境のもとでは、アプリケーションからデータが提示されたときに、TCP はデータを送信します。
ただし、未解決のデータに対して肯定応答がまだ受信されていないときは、 未解決のデータがすべて肯定応答されるまで、TCP は アプリケーションからの追加データの伝送を据え置きます。 Nagle アルゴリズムは、追加データを受け入れるために受信側のウィンドウが十分に開いている場合であっても、 この据え置きを実行します。 例えば、マウス・イベントというストリームを送るが応答を受け取らない対話式アプリケーションの場合、 伝送の据え置きの結果として大きな遅延が生じます。 このようなタイプのアプリケーションの場合は、Nagle アルゴリズムを使用不可にして応答時間を改善することができます。
注:
  1. Nagle アルゴリズムが使用可能になっているとき、TCP は、 前のデータの肯定応答が受信されるまで、小さいパケットのデータを送るために待機します。
  2. Nagle アルゴリズムが使用不可になっているとき、TCP は、 前のデータの肯定応答が受信される前でも、小さいパケットのデータを送ります。
ソケット・レベルで認識されるキーワードを 以下に示します。
キーワード
説明
SO_RCVBUF
OPTVAL に TCP/IP 受信バッファーのデータ部分のサイズをセットしま す。 受信バッファーのデータ部分のサイズは、各プロトコルごとに決まっています。 要求されたサイズが許容サイズを超える場合は、次のようになります。
  • TCP プロトコルを使用している場合は、-1 という戻り値と ENOBUFS の errno が設定されます。 受信バッファーのサイズは変更されません。

    TCP プロトコルの最大値については、「z/OS Communications Server: IP 構成解説書」の TCPCONFIG TCPRCVBUFRSIZE および TCPMAXRCVBUFSIZE パラメーターを参照してください。

  • UDP または RAW プロトコルを使用している場合は、ゼロの戻り値が戻され、 バッファー・サイズが 65535 にセットされます。
SO_SNDBUF
OPTVAL に TCP/IP 送信バッファーのデータ部分のサイズをセットします。 送信バッファーのデータ部分のサイズは、各プロトコルごとに決まっています。 要求されたサイズが許容サイズを超える場合は、次のようになります。
  • TCP プロトコルを使用している場合は、-1 という戻り値と ENOBUFS の errno が設定されます。 TCP 接続の送信バッファー・サイズは最大サイズに設定されます。 送信バッファー・サイズの値は、GETSOCKOPT を SO_SNDBUF に対して実行することによって取得できます。

    TCP プロトコルの最大値については、「z/OS Communications Server: IP 構成解説書」の TCPCONFIG TCPSENDBUFRSIZE パラメーターを 参照してください。

  • UDP または RAW プロトコルを使用している場合は、ゼロの戻り値が戻され、 バッファー・サイズが 65535 にセットされます。
SO_BROADCAST
メッセージをブロードキャストする機能を切り替えます。 デフォルト値は disabled です。このオプションを使用可能にすると、宛先で指定された インターフェースがパケットのブロードキャストをサポートしている場合は、アプリケーション が s を使用してブロードキャスト・メッセージを送信できるようになります。ストリーム・ソケットの場合は、このオプションに意味はありません。
SO_KEEPALIVE
ストリーム・ソケット用の TCP キープアライブ・メカニズムを切り替えます。デフォルト値は disabled です。キープアライブ・メカニズムは活動化されると、 それ以外のときはアイドル状態にある接続にパケットを定期的に送信します。リモート TCP が このパケットに対してまたはこのパケットが再送された際に応答しない場合は、 その接続は終了してエラー ETIMEDOUT が発行されます。
SO_LINGER
データがある場合、クローズを延長します。 デフォルト値は disabled です。close() が呼び出されたときにこのオプションが使用可能になっており、かつ未送信の データがある場合には、呼び出しアプリケーションは close() 呼び出しの間、その データが伝送されるまでまたはその接続がタイムアウトになるまでブロックされます。この オプションが使用不可である場合は、close() 呼び出しは呼び出し側をブロックすることなく 制御を戻し、TCP/IP アドレス・スペースはデータの送信を試みるためにそのまま待ちます。通常、データ転送は正常に行われますが、それが保証されているわけではありません。なぜなら、データ送信試行時に TCP/IP アドレス・スペースが待ち状態になっている時間は非常に限られているからです。このオプションは、ストリーム・ソケットの場合のみ意味をもちます。
SO_OOBINLINE
アウト・オブ・バンド・データの受信のトグルを行います。デフォルト値は disabled です。このオプションを使用可能にすると、アウト・オブ・バンド・データは 受信された順に通常のデータ入力キューに入れられるため、recv()、recvfrom()、およ び recvmsg() の呼び出し時に MSG_OOB フラグを指定しなくても、これらの関数で アウト・オブ・バンド・データを使用することができます。 このオプションを使用不可にすると、アウト・オブ・バンド・データは受信された順に 優先順位付きデータ入力キューに入れられるため、アウト・オブ・バンド・データ を recv()、recvfrom()、および recvmsg() で使用することができるのは、その 呼び出し時に MSG_OOB フラグを指定した場合のみとなります。このオプションは、ストリーム・ソケットの場合のみ意味をもちます。
SO_REUSEADDR
ローカル・アドレスの再利用を切り替えます。 デフォルトでは、使用不可 (disabled) です。 これは、bind() 呼び出しで使用される通常アルゴリズムを更新します。

通常 bind() 呼び出しのアルゴリズムでは、各 IP アドレスとポートの 組み合わせを一度だけバインドできます。 アドレスとポートが既にバインドされている場合は、 後続の bind() は失敗し、エラー EADDRINUSE を戻します。

'SO_REUSEADDR' オプションが活動状態になると、 以下の状態がサポートされます。
  • サーバーは、すべての呼び出しが異なるローカル IP アドレスを使用している限り、同じ ポートを複数回 bind() できます。ワイルドカード・アドレスの INADDR_ANY は、各ポート ごとに一度だけ使用されます。
  • クライアント接続がアクティブのサーバーは、再始動可能であり、クライアント接続のすべてを クローズしなくても、そのポートにバインドできます。
  • データグラム・ソケットの場合、マルチキャストがサポートされているので、bind() 呼び出しを 同じクラス D アドレスおよびポート番号に対して行うことができます。
IP レベル (IPPROTO_IP) で認識されるオプションを以下に示します。
オプション
説明
IP_MULTICAST_TTL
発信用のマルチキャスト・データグラムの IP 存続時間を設定します。 デフォルト値は 1 (ローカル・サブネットについてのみマルチキャストが使用できる) です。
IP_MULTICAST_LOOP
発信用のマルチキャスト・データグラムのループバックを使用可能あるいは使用不可にします。 デフォルトでは有効になっています。
IP_MULTICAST_IF
ソケット・アプリケーションから アウトバウンド・マルチキャスト・データグラムを送信するためのインターフェースをセットします。
注: マルチキャスト・データグラムを同時に複数のインターフェースで送信することはできません。
IP_ADD_MEMBERSHIP
特定のインターフェースでマルチキャスト・グループに参加します。 このオプションでは 1 つのインターフェースを指定してください。 マルチキャスト・データグラムを受け取る必要があるアプリケーションのみ、マルチキャスト・グループに参加する必要があります。
IP_DROP_MEMBERSHIP
マルチキャスト・グループから離脱します。

戻り値

値 0 は成功を示し、値 -1 はエラーを示します。 エラーの種類は errno によって示されます。
Errno
説明
EBADF
s パラメーターは、有効なソケット記述子ではありません。
EFAULT
パラメーター optval および optlen を使用すると、その結果として、呼び出し側のアドレス・スペースの外側のストレージへのアクセスが試みられる可能性があります。
ENOBUFS
使用可能なバッファー・スペースがありません。
ENOPROTOOPT
optname パラメーターが認識されないか、または level パラメーターが SOL_SOCKET ではありません。

getsockopt() オプショナル・セットの照会方法については getsockopt()を参照してください。
int rc;
int s;
int optval;
struct linger l;
int setsockopt(int s, int level, int optname,char *optval, int optlen);
⋮
/* I want out of band data in the normal inputqueue */
optval = 1;
rc = setsockopt(s, SOL_SOCKET, SO_OOBINLINE, (char *) &optval, sizeof(int));
 
⋮
/* I want to linger on close */
l.l_onoff  = 1;
l.l_linger = 100;
rc = setsockopt(s, SOL_SOCKET, SO_LINGER, (char *) &l, sizeof(l));

関連する呼び出し

fcntl()、getprotobyname()、getsockopt()、ioctl()、socket()