getsockopt() - ソケットに関連したオプションの取得

標準

標準/拡張機能 C/C++ 依存項目

XPG4.2
Single UNIX Specification、バージョン 3

両方  

形式

X/Open:
#define _XOPEN_SOURCE_EXTENDED 1
#include <sys/socket.h>

int getsockopt(int socket, int level, int option_name,
               void *__restrict__ option_value, 
               socklen_t *__restrict__ option_len);
バークレー・ソケット:
#define _OE_SOCKETS
#include <sys/types.h>
#include <sys/socket.h>

int getsockopt(int socket, int level, int option_name,
               char *option_value,
               int *option_len);
IPv6: IPv6 ソケット・オプションに対するサポートを組み込むには、次のコードを追加してください。
#define _OPEN_SYS_SOCK_IPV6 1
#include <netinet/in.h>
icmp6_filter 構造体: プログラムに icmp6_filter 構造体をインクルードするには、次のコードを追加してください。
#define _OPEN_SYS_SOCK_IPV6
#include <netinet/icmp6.h>

機能説明

getsockopt() 呼び出しは、ソケットに関連する オプションを取得します。すべてのオプションが、すべてのアドレス・ファミリーによってサポートされ るわけではありません。詳細は、各オプションを参照してください。オプションは、マルチプロトコル・レベルで存在できます。
パラメーター
説明
socket
ソケット記述子。
level
オプションを設定するレベル。
option_name
指定ソケット・オプションの名前。
option_value
オプション・データへのポインター。
option_len
オプション・データの長さへのポインター。

ソケット・オプションを操作する際、オプションが常駐するレベルとオプション名を指定する必要があります。ソケット・レベルでオプションを操作するには、sys/socket.h に定義されているように、level パラメーターを SOL_SOCKET に設定する必要があります。IPv4 または IPv6 レベルでオプションを操作するには、level パラメーターを、sys/socket.h に定義されている IPPROTO_IP、または netinet/in.h に定義されている IPPROTO_IPV6 に設定する必要があります。その他のレベル (TCP レベルなど) でオプションを操作するには、オプションを制御するプロトコルに該当するプロトコル番号を提供してください。getprotobyname() 呼び出しを使用して、名前を指定された プロトコルのプロトコル番号を戻すことができます。

option_value および option_len パラメーターは、特に get コマンドで使用されるデータを戻すために使用されます。option_value パラメーターは、get コマンドによって要求される データを受信するためのバッファーを指します。option_len パラメーターは、option_value パラメーターで指定されるバ ッファーのサイズを指します。それは、getsockopt() を呼び出す前に、バッファーのサイズに初期設定して おかなければなりません。戻り時に、戻されたデータの実際のサイズに設定されます。

SO_LINGER、SO_RCVTIMEO、SO_SNDTIMEO を除くすべてのソケット・レベルのオプション では、option_value が整数をポイントしていて、option_len には整数のサイズが設定されていると予期されます。整数がゼロ以外の場合には、オプションは使用可能です。ゼロの場合は、オプションは使用不可です。SO_LINGER オプション では、sys/socket.h に定義されているように linger 構造体を option_value が ポイントしていると予期されます。この構造体は以下の例のように定義されます。
struct  linger
{
       int     l_onoff;                /* option on/off */
       int     l_linger;               /* linger time */
};

l_onoff フィールドは、SO_LINGER オプションが使用できない場合、ゼロに設定されます。ゼロ以外の値の場合、オプションは使用可能になります。l_linger フィールドは、クローズ時に残っている時間の長さを 指定します。

以下のオプションが、IPv4 レベルで認識されます。
オプション
説明
IP_MULTICAST_IF
(RAW および UDP) アウトバウンド・マルチキャスト・データグラムの送信に使われる、インターフェース IP アドレスの取得に使用される。 in_addr 構造体を使用して IP アドレスが渡されます。
IP_MULTICAST_LOOP
(RAW および UDP) ループバックが使用可能か使用不可かを判別するために使用される。 ループバック標識が、u_char として渡されます。値 0 はループバックが使用不可であることを示し、値 1 は使用可能であることを示します。
IP_MULTICAST_TTL
(RAW および UDP) 発信マルチキャスト・データグラムの IP データグラム存続時間 (ホップ) を戻す。TTL 値が u_char として渡されます。
IP_RECVPKINFO
(RAW および UDP) 着信パケットの宛先 IP アドレスと、パケットの受信に使用されたインターフェースを戻すことを使用可能にするか、使用不可にするかを示します。setsockopt() 関数がこのオプションの設定に使用される場合、設定された値が戻されます。オプション値は、 int としてパスされてきます。値 0 はオプションが使用不可であることを示し、値 1 はオプションが使用可能であることを示します。このオプションが使用可能である場合、情報は、recvmsg() 関数呼び出しで IP_PKTINFO 補助データとして戻されます。

このオプションは、_OPEN_SYS_SOCK_EXT4 フィーチャー・テスト・マクロによって保護されます。

以下のオプションが、IPv6 レベルで認識されます。

オプション
説明
IPV6_ADDR_PREFERENCES
(TCP および UDP) 所定ソケットのソース・アドレス選択優先フラグの取得に使用される。 これらのフラグは、32 ビット符号なし整数の戻されたオプション値内のビットとして定義される。戻されるフラグは、デフォルトの優先フラグか、setsockopt() によって以前に設定されたフラグのどちらかである。フラグ・ビット値の定数は netinet/in.h で定義されます。
IPV6_CHECKSUM
(RAW) チェックサム・プロセッシングが RAW (非 ICMPv6) ソケットで使用可能か判別するために使用される。 戻されるオプション値は、チェックサムが配置されるユーザー・データへのオフセット。これは、int として渡されます。 値 -1 は、関数が使用不可であることを示す。
IPV6_DONTFRAG
(RAW および UDP) このオプションは、UDP ソケットおよびロー・ソケットに対するパケットへのフラグメント・ヘッダーの自動挿入をオフにする。
IPV6_DSTOPTS
(RAW および UDP) ゼロのオプション長を指定してこのオプションに対する setsockopt() を呼び出すことによって、アプリケーションはスティッキー宛先オプション・ヘッダーを除去できる。
IPV6_HOPOPTS
(RAW および UDP) ゼロのオプション長を指定してこのオプションに対する setsockopt() を呼び出すことによって、アプリケーションはスティッキー・ホップ単位オプション・ヘッダーを除去できる。
IPV6_MULTICAST_HOPS
(RAW および UDP) アウトバウンド・マルチキャスト・データグラムのホップしきい値を戻す。 ホップしきい値は int としてパスされてきます。
IPV6_MULTICAST_IF
(RAW および UDP) アウトバウンド・マルチキャスト・データグラムの送信に使われたインターフェースのインターフェース・インデックスを戻す。 インターフェース・インデックスは、u_int として渡されます。
IPV6_MULTICAST_LOOP
(RAW および UDP) 発信マルチキャスト・パケットのループバックが使用可能か使用不可かを判別するために使用される。 ループバック標識が u_int として渡されます。値 0 はオプションが使用不可であることを示し、値 1 は使用可能であることを示します。
IPV6_NEXTHOP
(RAW および UDP) ソケット・アドレス構造としてデータグラムのネクスト・ホップを指定する。
IPV6_RECVDSTOPTS
(RAW および UDP) 宛先オプション・ヘッダーを受け取るには、このオプションを使用可能にする必要がある。
IPV6_RECVHOPLIMIT
(RAW、TCP、および UDP) 受信されたホップ限界を、recvmsg() 関数呼び出しで IPV6_HOPLIMIT 補助データとして戻します。オプション値は、 int としてパスされてきます。値 0 はオプションが使用不可であることを示し、値 1 はオプションが使用可能であることを示します。
IPV6_RECVHOPOPTS
(RAW および UDP) ホップ単位オプション・ヘッダーを受け取るには、このオプションを使用可能にする必要がある。
IPV6_RECVPATHMTU
(RAW および UDP) recvmsg() 関数呼び出しで IPV6_PATHMTU 補助データとしてパス MTU を戻します。
IPV6_RECVPKTINFO
(RAW および UDP) 着信パケットの宛先 IP アドレスと、パケットの受信に使用されたインターフェースを戻すことを使用可能にするか、使用不可にするかを示します。オプション値は、 int としてパスされてきます。値 0 はオプションが使用不可であることを示し、値 1 はオプションが使用可能であることを示します。このオプションが使用可能である場合、情報は、recvmsg() 関数呼び出しで IPV6_PKTINFO 補助データとして戻されます。
IPV6_RECVRTHDR
(RAW および UDP) ルーティング・ヘッダーを受け取るには、このオプションを使用可能にする必要がある。
IPV6_RECVTCLASS
(RAW、TCP、および UDP) トラフィック・クラスを受け取るには、このオプションを使用可能にする必要がある。
IPV6_RTHDR
(RAW および UDP) ゼロのオプション長を指定してこのオプションに対する setsockopt() を呼び出すことによって、アプリケーションはスティッキー・ルーティング・ヘッダーを除去できる。
IPV6_RTHDRDSTOPTS
(RAW および UDP) ゼロのオプション長を指定してこのオプションに対する setsockopt() を呼び出すことによって、アプリケーションはスティッキー宛先オプション・ヘッダーを除去できる。
IPV6_TCLASS
(RAW、TCP、および UDP) トラフィック・クラス値を指定するには、このオプションを使用可能にする必要がある。
IPV6_UNICAST_HOPS
(RAW および UDP) アウトバウンド・ユニキャスト・データグラムのホップしきい値を戻す。 ホップしきい値は int としてパスされてきます。
IPV6_USE_MIN_MTU
(RAW、TCP、および UDP) IP レイヤーが、パス MTU ディスカバリーをバイパスして、パケット送信に最小 MTU サイズ (1280) を使用するかどうかを示す。 オプション値は、 int としてパスされてきます。-1 の値は、ユニキャスト (使用不可) およびマルチキャスト (使用可能) 宛先のデフォルト値が 使用される原因になります。0 の値は、ユニキャストおよびマルチキャスト宛先のこのオプションを使用不可に設定します。1 の値は、ユニキャストおよびマルチキャスト宛先のこのオプションを使用可能にして、最小 MTU サイズが使用されます。 getsockopt() 呼び出しの前に setsockopt() 呼び出しが行われなかった場合、デフォルト値の -1 が戻されます。
IPV6_V6ONLY
(RAW、TCP、および UDP) ソケットが、IPv6 コミュニケーションのみに制限されるかどうかを判別するために使用されます。オプション値は、 int としてパスされてきます。 ゼロ以外の値は、オプションが使用可能 (ソケットは IPv6 コミュニケーションのみに使用可能) であることを示します。 0 は、オプションが使用不可であることを示します。

以下のオプションが、ICMPv6 レベルで認識されます。

オプション
説明
ICMP6_FILTER
(RAW) ICMPv6 メッセージのフィルター操作に使用されます。 この関数は、このソケットに使用されたフィルター値を戻す。これは、netinet/icmp6.h で定義された icmp6_filter 構造体の中に返される。
以下のようなオプションが、ソケット・レベルで認識されます。
オプション
説明
SO_ACCEPTCONN
ソケットは listen() 呼び出しを行った。
SO_BROADCAST
メッセージをブロードキャストする機能を切り替えます。このオプションを使用可能にすると、宛先に指定したインターフェースがパケットのブロードキャストをサポートするならば、アプリケーションは、ブロードキャスト・メッセージをソケット 上で送ることができる。このオプションは、ストリーム・ソケットには何の意味もありません。このオプションは、AF_INET ドメインの場合にのみ有効です。
SO_DEBUG
デバッグ情報が記録されているかどうかを報告する。このオプションは int 値を保管する。
SO_ERROR
ソケット上の保留中のエラーを戻し、エラー状況をクリアする。SO_ERROR を使用すると、接続されたデータグラム・ソケット上の 非同期エラー、またはその他の非同期エラー (ソケット呼び出しの 1 つで明示的 に戻されないエラー) をチェックすることができる。
SO_KEEPALIVE
ストリーム・ソケットの TCP キープアライブ・メカニズムを切り替えます。活動化されていると、キープアライブ・メカニズムによって、パケットが定期的に異なるアイドル接続に送信されます。リモート TCP がパケット、またはパケットの再送に応答しない場合は、接続は、エラー ETIMEDOUT で終了します。そのソケットへ書き込むプロセスは、SIGPIPE シグナルで通知されます。このオプションは int 値を保管します。このオプションは、AF_INET および AF_INET6 ドメインの場合にのみ有効です。
SO_LINGER
データが存在している場合は、クローズに留まります。このオプションを使用可能にし、close() が呼び出されるとき、未送信のデータが存在すると、呼び出し側のアプリケーションは、データが転送されるまで、または接続がタイ ムアウトになるまで、close() 呼び出し中にブロックされる。このオプションが使用できない場合、TCP/IP アドレス・スペースは、データを送信する前にいったん待機します。TCP/IP アドレス・スペースの待機時間は、データを送信しようとする 時間のうちの限られた時間だけなので、データ転送は通常は正常に 行われますが、保証はできません。close() 呼び出しは、呼び出し元をブロックしないで、戻ります。このオプションは、ストリーム・ソケットにのみ意味を持ちます。
SO_OOBINLINE
帯域外データの受信を切り替える。このオプションが使用できる場合、帯域外データは、受信されたとおりに通常のデータ入力キューに入ります。そのため、関数の呼び出しで MSG_OOB フラグを指定する必要なく、recv()、 recvfrom()、および recvmsg() で使用可能になる。このオプションが使用できない場合、帯域外データは、受信されたとおりに優先順位データ入力キューに入ります。そのため、呼び出しで MSG_OOB フラグが指定されている場合のみ、recv()、recvfrom()、および recvmsg() で使用可能になる。このオプションは、ストリーム・ソケットにのみ意味を持ちます。
_SO_PROPAGATEUSERID
AF_UNIX ストリーム・ソケットによるユーザー ID (UID) の伝搬を切り替えます。 使用可能な場合は、connect() 関数が呼び出されるとユーザー (UID) 情報 がシステムから取り出されます。accept() 関数が呼び出されると、アクセプターは、受け入れられたソケットがクローズされるまで、コネクターの識別を想定します。
SO_RCVBUF
受信バッファー・サイズ情報を報告する。このオプションは int 値を保管する。
SO_RCVTIMEO

入力関数がその完了まで待つ時間とともにタイムアウト値を報告します。

追加データを受信することなくこの時間の間ブロックしていた受信操作は、 部分的なカウントで戻るか、受信したデータがない場合は errno を EWOULDBLOCK に 設定して戻ります。このオプションのデフォルトはゼロです。 これは、受信操作がタイムアウトしないことを意味します。

SO_REUSEADDR

ローカル・アドレスの再使用を切り替えます。このオプションを使用可能にすると、既に使用中のローカル・アドレスをバインドすることができます。SO_REUSEADDR は、bind() 呼び出しで使用される通常のアルゴリズムを変更する。

ローカル・アドレスおよびポートに、同じ外部アドレスおよびポート がないことを確認するために、システムでは接続時間に検査が行われ ます。関連が既に存在している場合には、エラー EADDRINUSE が戻されます。

SO_REUSEADDR オプションがアクティブになって以降は、以下の状態がサポートされます。

すべての呼び出しが別々のローカル IP アドレスを使用し、ワイルドカード・アドレス INADDR_ANY がポートごとに 1 回のみ使用されている限り、サーバーは同じポートを複数回 bind() できます。

このオプションは、AF_INET および AF_INET6 ドメインの場合にのみ有効です。

SO_SECINFO
受信セキュリティー情報を切り替えます。AF_UNIX UDP ソケット上で使用可能にされると、recvmsg() 関数は、各データグラムの送信側に関するセキュリティー情報を補助データとして戻します。この情報は、送信側のユーザー ID、UID、GID、およびジョブ名を含み、sys/socket.h の secsinfo 構造体によってマップされます。
SO_SNDBUF
送信バッファー・サイズ情報を報告する。このオプションは int 値を保管する。
SO_SNDTIMEO

データ送信を防止するフロー制御が原因で出力関数がブロックする時間を指定する、 タイムアウト値を報告します。

この時間の間ブロックされた送信操作は、部分的なカウントで 戻るか、送信されたデータがない場合は errno を EWOULDBLOCK に設定して戻ります。このオプションの デフォルトはゼロです。これは、送信操作がタイムアウトにならないことを意味します。

SO_TYPE
このオプションは、ソケットのタイプを戻す。戻り時に、option_value で指定される整数が、SOCK_STREAM または SOCK_DGRAM に設定される。このオプションは、 AF_UNIX、AF_INET および AF_INET6 ドメインの場合にのみ有効です。

C++ の特殊な動作: C++ でこの関数を使用するには、_XOPEN_SOURCE_EXTENDED 1 フィーチャー・テスト・マクロを 使用する必要があります。

戻り値

正常に実行された場合、getsockopt() は 0 を戻します。

正常に実行されなかった場合、getsockopt() は -1 を戻して、errno を次のいずれかの 値に設定します。
エラー・コード
説明
EBADF
socket パラメーターが無効ソケット記述子です。
EFAULT
option_value および option_len パラメーターを使用すると、呼び出し元のアドレス・スペースの外側のストレージにアクセスすることになります。
EINVAL
指定されたオプションは、指定されたソケット・レベルでは無効です。
ENOBUFS
メッセージの送信にバッファー・スペースを使用することができません。
ENOPROTOOPT
option_name パラメーターが認識されていないか、または level パラメーターが SOL_SOCKET ではありません。
ENOSYS
関数がインプリメントされていません。まだ使用可能になっていない関数を使用しようとしました。
ENOTSOCK
記述子はファイル用であり、ソケット用ではありません。
EOPNOTSUPP
その操作は、ソケット・プロトコルではサポートされていません。少なくとも、以下のオプションはサポートされていません。
  • IPV6_JOIN_GROUP
  • IPV6_LEAVE_GROUP
  • IP_ADD_SOURCE_MEMBERSHIP
  • IP_DROP_SOURCE_MEMBERSHIP
  • IP_DROP_MEMBERSHIP
  • IP_ADD_MEMBERSHIP
  • IP_BLOCK_SOURCE
  • IP_UNBLOCK_SOURCE
  • MCAST_JOIN_GROUP
  • MCAST_LEAVE_GROUP
  • MCAST_BLOCK_SOURCE
  • MCAST_UNBLOCK_SOURCE
  • MCAST_JOIN_SOURCE_GROUP
  • MCAST_LEAVE_SOURCE_GROUP

getsockopt() 呼び出しの例を以下に示します。setsockopt() 呼び出しオプションを設定する方法の例 は、setsockopt() - ソケットに関連したオプションの設定を参照してください。
int rc;
int s;
int option_value;
int option_len;
struct linger l;
int getsockopt(int s, int level, int option_name,
char *option_value,
     int *option_len);

⋮
/* Is out-of-band data in the normal input queue? */
option_len = sizeof(int);
rc = getsockopt(
        s, SOL_SOCKET, SO_OOBINLINE, (
char *) &option_value, &option_len);
if (rc == 0)
{
    if (option_len == sizeof(int))
    {
         if (option_value)
            /* yes it is in the normal queue */
         else
            /* no it is not
                  */
    }
}

⋮
/* Do I linger on close? */
option_len = sizeof(l);
rc = getsockopt(
        s, SOL_SOCKET, SO_LINGER, (char *) &l, &option_len);
if (rc == 0)
{
    if (option_len == sizeof(l))
    {
         if (l.l_onoff)
            /* yes I linger */
         else
            /* no I do not  */
    }
}

関連情報