getsockopt

Autres langues

Langue: ja

Version: 1999-05-24 (fedora - 25/11/07)

Section: 2 (Appels système)

名前

getsockopt, setsockopt - ソケットのオプションの設定と取得を行なう

書式

 #include <sys/types.h>          /* 「注意」参照 */
 
#include <sys/socket.h> int getsockopt(int s, int level, int optname, void *optval, socklen_t *optlen); int setsockopt(int s, int level, int optname, const void *optval, socklen_t optlen);

説明

getsockopt() と setsockopt() はソケットに関連する options を操作する。オプションは複数のプロトコル層(level)に存在するかもしれないが、 これらは常に最上位の socket 層へと設定される。

ソケット・オプションを操作する際には、オプションの層(level)とオプションの 名前を指定しなければならない。ソケット層でオプションを操作する為には、 levelSOL_SOCKET に指定する。 他の全ての層でオプションを操作する為には、与えられたオプションの 制御主体となるプロトコルのプロトコル番号を指定する。例えば、 オプションが TCP プロトコルで解釈されるべきことを指示するには、 levelTCP のプロトコル番号を指定しなければならない。 getprotoent(3) を参照すること。

optvaloptlen パラメーターは setsockopt() のオプションの値にアクセスするために用いられる。 getsockopt() では要求したオプションの値を返すためのバッファーを指定する。 getsockopt() では optlen は値と結果両用のパラメーターで、最初に optval の指しているバッファーのサイズを与え、実際に返される値のサイズに 書き換えられる。もしオプション値を与えず、返されもしない場合には optval は NULL でも良い。

optname および指定されたオプションは解釈されずに、適切なプロトコル・モジュールに 渡されて解釈される。インクルード・ファイル <sys/socket.h> には後述のソケット層のオプションの定義が含まれている。 他のプロトコル層では名前や形式は異なる。 マニュアルのセクション 4 の適切なエントリを参照すること。

ほとんどのソケット層のオプションは optvalint パラメーターを利用する。 setsockopt() で、二値(boolean)オプションを有効(enable)にするにはゼロ以外を指定し、 無効(disable)にするにはゼロを指定する。

利用可能なソケットオプションの説明に関しては、 socket(7) と適切なプロトコルの man ページを参照のこと。

返り値

成功した場合にはゼロを返す。エラー時には -1 が返され、 errno が適切に設定される。

エラー

EBADF
引き数 s が有効なディスクリプタでない。
EFAULT
optval で指定されたアドレスがプロセスのアドレス空間の有効な部分ではない。 getsockopt() の場合、 optlen がプロセスのアドレス空間の有効な部分でない場合にもこのエラーが返される。
EINVAL
setsockopt() で option が不正である。
ENOPROTOOPT
指定された層(level)にはこのオプションは存在しない。
ENOTSOCK
引き数 s はファイルであり、ソケットでない。

準拠

SVr4, 4.4BSD (これらのシステム・コールは 4.2BSD で最初に現れた), POSIX.1-2001.

注意

POSIX.1-2001 では <sys/types.h> のインクルードは必須とされておらず、 Linux ではこのヘッダファイルは必要ではない。 しかし、歴史的には、いくつかの実装 (BSD 系) でこのヘッダファイルが 必要であり、移植性が必要なアプリケーションではこのファイルを インクルードするのが賢明であろう。

getsockopt() と setsockopt() の optlen 引き数は実際は int [*] である (そして 4.x BSD と libc4 と libc5 はそうなっている)。 POSIX では紆余曲折を経て現在の socklen_t になっており、 glibc でも socklen_t を使っている。 accept(2) も参照のこと。

バグ

ソケットのオプションのいくつかはシステムのより低い層で 処理されるべきである。

関連項目

ioctl(2), socket(2), getprotoent(3), protocols(5), socket(7), tcp(7), unix(7)