getsockopt(2) FreeBSD 一般コマンドマニュアル

getsockopt

前のページ 上に戻る 次のページ

getsockopt




書式

     #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() は、ソケットに対応する オプションを操作しま
     す。オプションは複数のプロトコルレベルに存在する可能性があります。これら
     は必ず最上位の ``ソケット'' レベルに存在します。

     ソケットオプションを操作する際は、オプションが常駐するレベルおよびオプ
     ションの名前を指定する必要があります。ソケットレベルでオプションを操作す
     るには level を SOL_SOCKET として指定します。他のレベルでオプションを操作
     するには、オプションを制御している適切なプロトコルのプロトコル番号を指定
     します。例えば、オプションが TCP プロトコルによって解釈されることを指示す
     るには、 level を TCP のプロトコル番号に設定する必要があります。
     getprotoent(3) を参照してください。

     パラメータ optvaloptlen は、 setsockopt() がオプション値にアクセスす
     るために使用されます。 getsockopt() の場合、これらは要求されたオプション
     の値が返されるバッファを識別します。 getsockopt() の場合、 optlen は「値
     - 結果」パラメータであり、初期には optval の指すバッファのサイズが入って
     おり、戻り時に修正されて返された値の実際のサイズを示すようになります。オ
     プション値を指定しないか、またはオプション値が返されない場合、 optval に
     NULL を指定してもかまいません。

     optname および指定のオプションは、解釈されずに、解釈用の該当プロトコルモ
     ジュールに渡されます。インクルードファイル <sys/socket.h> には後述するソ
     ケットレベルオプション用の定義が入っています。他のプロトコルレベルのオプ
     ションは形式と名称がさまざまです。マニュアルのセクション 4 の該当するエン
     トリを参照してください。

     ほとんどのソケットレベルのオプションは optval 用に int パラメータを使用し
     ます。 setsockopt() の場合、ブール演算を有効にするためにはパラメータは 0
     でない必要があり、オプションを無効にする場合は 0 である必要があります。
     SO_LINGER は、 <sys/socket.h> で定義された struct linger パラメータを使用
     します。これは、目的の状態のオプションとリンガーインターバル (後述) を指
     定します。 SO_SNDTIMEO と SO_RCVTIMEO は、 <sys/time.h> で定義された
     struct timeval パラメータを使用します。

     以降のオプションがソケットレベルで認識されます。別記した場合を除いて、各
     オプションが getsockopt() で調べられ、 setsockopt() で設定されます。

           SO_DEBUG           デバッグ情報の記録を有効にします
           SO_RCVTIMEO        入力についてのタイムアウト値を設定します
           SO_ACCEPTFILTER    待ち受けソケットでの受け取り用フィルタを設定しま
                              す
           SO_TYPE            ソケットのタイプを取得します (取得のみ)
           SO_ERROR           ソケットのエラーを取得してクリアします (取得の
                              み)

     SO_DEBUG は下層のプロトコルモジュール内でデバッグを有効にします。
     SO_REUSEADDR は、 bind(2) 呼び出しで指定されたアドレスを検証するのに使用
     する規則で、ローカルアドレスの再利用が可能であることを示します。
     SO_REUSEPORT は、ポートをバインドする前の複数のプロセスがすべて
     SO_REUSEPORT を設定している場合に、複数のプロセスによる完全に重複したバイ
     ンドが可能になるようにします。このオプションは、プログラムの複数のインス
     タンスそれぞれが、バインドされたポートを宛先とする UDP/IP マルチキャスト
     またはブロードキャストのデータグラムを受信できるようにします。
     SO_KEEPALIVE は接続されたソケット上でメッセージの周期的な送信を有効にしま
     す。接続された一方がこれらのメッセージに応答できない場合は接続が破壊され
     ていると考えられ、ソケットを使用しているプロセスはデータを送信しようとす
     るときに SIGPIPE シグナルによって通知を受けます。 SO_DONTROUTE は発信メッ
     セージが標準の経路設定機能をバイパスする必要があることを示します。代わり
     に、メッセージは、宛先アドレスのネットワーク部分に従って該当するネットワ
     ークインタフェースに転送されます。

     SO_LINGER は送信されていないメッセージがソケットの待ち行列にあり、しかも
     close(2) が実行される時に行なわれる処置を制御します。ソケットがデータの信
     頼できる配信を確約し、しかも SO_LINGER が設定されている場合、データを送信
     できるまで または情報を配信できない (リンガーインターバルと呼ばれるタイム
     アウト時間は、 SO_LINGER が要求されるときに setsockopt() 呼び出し内で秒単
     位で指定されます) と判定するまで、システムはプロセスを close(2) 上でブ
     ロックします。 SO_LINGER が無効の状態で close(2) が起動されると、システム
     は、プロセスが可能な限り迅速に処理を継続できる方法でクローズ処理を行いま
     す。

     オプション SO_BROADCAST は、ソケット上でブロードキャストデータグラムを送
     信するパーミッションを要求します。ブロードキャストは、システムの初期バー
     ジョンでは特権操作でした。バンド外のデータをサポートするプロトコルで、
     SO_OOBINLINE オプションは、バンド外のデータが受信された順番で通常のデータ
     入力待ち行列に配置されることを要求します。そして、これは MSG_OOB フラグな
     しに recv(2) 呼び出しまたは read(2) 呼び出しでアクセスできます。常に この
     オプションが設定されているかのように動作するプロトコルもあります。
     SO_SNDBUF と SO_RCVBUF は、それぞれ、出力および入力用に割り当てられる通常
     のバッファサイズを調整するオプションです。バッファのサイズは、高ボリュー
     ム接続のために増加することができますし、着信データの可能なバックログを制
     限するために減少させることもできます。システムはこれらの値について 1 つの
     絶対最大値を設定します。この最大値は sysctl(3) MIB 変数
     ``kern.ipc.maxsockbuf'' によってアクセスできます。

     SO_SNDLOWAT は出力操作に最小カウントを設定するオプションです。ほとんどの
     出力操作は、送信用のプロトコルにデータを配信し、フロー制御のためにブロッ
     クしながら呼び出しによって与えられたすべてのデータを処理します。ノンブ
     ロッキング出力操作は、ブロックなしのフロー制御に従って許容される限界まで
     データを処理しますが、フロー制御が最低基準値または要求全体のいずれか小さ
     れは、出力操作完了の待機を制限するために使用される秒数、マイクロ秒数を
     struct timeval パラメータで指定します。送信操作が指定された時間以上ブロッ
     クされた場合、部分的なカウントで戻るか、またはデータが送信されていない場
     合はエラー EWOULDBLOCK で戻ります。現在の実装では、このタイマは追加の各デ
     ータがプロトコルに配信されるたびに再起動され、これはサイズが出力用の最低
     基準値から最高基準値の範囲に至る出力部分に適用されることを意味します。
     SO_RCVTIMEO は入力操作についてタイムアウト値を設定するオプションです。こ
     れは入力操作完了の待機を制限するために使用される秒数、マイクロ秒数を
     struct timeval パラメータで指定します。現在の実装では、このタイマは追加の
     データがプロトコルによって受信されるたびに再起動されるので、制限は実際に
     は休止期間のタイマとなります。追加のデータを受信することなく受信操作がこ
     れだけの時間についてブロックされた場合、短いカウントで戻るか、またはデー
     タが受信されていない場合はエラー EWOULDBLOCK で戻ります。

     SO_ACCEPTFILTER は、ソケット上に accept_filter(9) を置きます。これによ
     り、待ち受けしているストリームソケットに入ってくる接続が accept(2) に渡さ
     れる前にフィルタされることになります。

     struct  accept_filter_arg {
             char    af_name[16];
             char    af_arg[256-16];
     };

     optvalstruct accept_filter_arg を指さなくてはなりません。この構造体が
     accept_filter(9) を選択、設定します。 af_name は、アプリケーションが待ち
     受けソケット上に置きたいと思っている受け取り用フィルタの名前で埋めなくて
     はなりません。 af_arg はオプションのパラメータで、 af_name で指定された受
     け取り用フィルタに渡すことができるものです。これにより、ソケットに置かれ
     る時にさらなる設定オプションを提供します。 NULL を optval 中で渡すと、
     フィルタが削除されます。

     最後に、 SO_TYPE と SO_ERROR は getsockopt() でだけ使用されるオプションで
     す。 SO_TYPE では SOCK_STREAM のようなソケットのタイプが返ります。これは
     スタートアップ時にソケットを継承するようなサーバに便利です。 SO_ERROR は
     ソケット上で延期中のエラーを返し、エラー状態をクリアします。これは接続さ
     れたデータグラムソケット上の非同期的エラーをチェックしたり、その他の非同
     期エラーをチェックするのに使用できます。


実装に関する注

     非スレッドライブラリでは、 getsockopt() は getsockopt システムコールとし
     て実装されています。

     スレッドライブラリでは、 getsockopt システムコールは
     _thread_sys_getsockopt() にアセンブルされ、 getsockopt() は、読み書きにつ
     いて s をロックしてから、 _thread_sys_getsockopt() を呼び出す関数として実
     装されています。戻る前に getsockopt() は s をアンロックします。

     非スレッドライブラリでは、 setsockopt() は setsockopt システムコールとし
     て実装されています。

     スレッドライブラリでは、 setsockopt システムコールは
     _thread_sys_setsockopt() にアセンブルされ、 setsockopt() は、読み書きにつ
     [ENOPROTOOPT]      指示されたレベルでオプションは存在しません。

     [EFAULT]           optval が指すアドレスがプロセスアドレス空間の有効な部
                        分にありません。 getsockopt() では、 optlen がプロセス
                        アドレス空間の有効な部分でない場合も、このエラーが返さ
                        れる可能性があります。


関連項目

     ioctl(2), socket(2), getprotoent(3), sysctl(3), protocols(5), sysctl(8),
     accept_filter(9)


バグ

     ソケットオプションのいくつかはシステムの低いレベルで処理される必要があり
     ます。


歴史

     getsockopt() システムコールは 4.2BSD ではじめて登場しました。

FreeBSD 4.4                       May 2, 1995                      FreeBSD 4.4

ABELNET VPSサービス