getsockopt, setsockopt -
ソケットのオプションの設定と取得を行なう
#include <sys/types.h> /* 「注意」参照 */
#include <sys/socket.h>
int getsockopt(int sockfd, int level, int optname,
void *optval, socklen_t *optlen);
int setsockopt(int sockfd, int level, int optname,
const void *optval, socklen_t optlen);
getsockopt() と
setsockopt()
は、ファイルディスクリプター
socket
で参照されるソケットに関連するオプションの操作を行う。
オプションは複数のプロトコル層(level)に存在するかもしれないが、
これらは常に最上位のソケット層へと設定される。
ソケットオプションを操作する際には、オプションの層
(level) と
オプションの名前を指定しなければならない。
ソケット API
層でオプションを操作する為には、
level を
SOL_SOCKET
に指定する。
他の全ての層でオプションを操作する為には、与えられたオプションの
制御主体となるプロトコルのプロトコル番号を指定する。例えば、
オプションが
TCP
プロトコルで解釈されるべきことを指示するには、
level に
TCP
のプロトコル番号を指定しなければならない。
getprotoent(3)
を参照すること。
optval と
optlen 引数は
setsockopt()
のオプションの値にアクセスするために用いられる。
getsockopt()
では要求したオプションの値を返すためのバッファーを指定する。
getsockopt() では
optlen
は値と結果両用の引数で、最初に
optval
の指しているバッファーのサイズを与え、実際に返される値のサイズに
書き換えられる。もしオプション値を与えず、返されもしない場合には
optval は NULL でも良い。
optname
および指定されたオプションは解釈されずに、適切なプロトコルモジュールに
渡されて解釈される。インクルードファイル
<sys/socket.h>
には後述のソケット層のオプションの定義が含まれている。
他のプロトコル層では名前や形式は異なる。
マニュアルのセクション
4
の適切なエントリーを参照すること。
ほとんどのソケット層のオプションは
optval に
int
引数を利用する。
setsockopt()
で、二値(boolean)オプションを有効(enable)にするにはゼロ以外を指定し、
無効(disable)にするにはゼロを指定する。
利用可能なソケットオプションの説明に関しては、
socket(7)
と適切なプロトコルの
man
ページを参照のこと。
On success, zero is returned for the standard options. On error, -1 is returned,
and
errno is set appropriately.
Netfilter allows the programmer to define custom socket options with associated
handlers; for such options, the return value on success is the value returned
by the handler.
- EBADF
- 引数 sockfd
は有効なファイルディスクリプターでない。
- EFAULT
-
optval
で指定されたアドレスがプロセスのアドレス空間の有効な部分ではない。
getsockopt() の場合、 optlen
がプロセスのアドレス空間の有効な部分でない場合にもこのエラーが返される。
- EINVAL
-
setsockopt() で option
が不正である。 optval
に無効な値が指定された場合にも、このエラーが発生する可能性がある
(例えば、 ip(7)
に説明がある IP_ADD_MEMBERSHIP
オプションなど)。
- ENOPROTOOPT
- 指定された層(level)にはこのオプションは存在しない。
- ENOTSOCK
- ファイルディスクリプター
sockfd
がソケットを参照していない。
POSIX.1-2001, POSIX.1-2008, SVr4, 4.4BSD
(これらのシステムコールは
4.2BSD で最初に現れた)
POSIX.1 では
<sys/types.h>
のインクルードは必須とされておらず、
Linux
ではこのヘッダーファイルは必要ではない。
しかし、歴史的には、いくつかの実装
(BSD 系)
でこのヘッダーファイルが
必要であり、移植性が必要なアプリケーションではこのファイルを
インクルードするのが賢明であろう。
For background on the
socklen_t type, see
accept(2).
ソケットのオプションのいくつかはシステムのより低い層で
処理されるべきである。
ioctl(2),
socket(2),
getprotoent(3),
protocols(5),
ip(7),
packet(7),
socket(7),
tcp(7),
udp(7),
unix(7)
この man ページは Linux
man-pages
プロジェクトのリリース
5.10
の一部である。プロジェクトの説明とバグ報告に関する情報は
https://www.kernel.org/doc/man-pages/
に書かれている。