ソケットオプション

  • getsockopt, setsockopt

  • fcntl

  • ioctl

  • getsockopt関数, setsockopt関数

    getsockopt関数、setsockopt関数は、ソケットにのみ適用可能

    TCPサーバーでは、bindの呼び出しに先立って、SO_REUSEADDRをsetsockopt関数で設定すべし。

    SO_KEEPALIVEソケットオプションは、ハーフオープンコネクションを自動的に切断するために、多くのTCPサーバーで設定されている。




    fcntl関数

    fcntl(file control)関数で、種々のディスクリプタ制御を行える。


    fcntl関数は、ネットワークプログラミングに関連した次のような機能を提供している。

    ブロッキングI/O。F_SETFLコマンドを用いてファイルのO_NONBLOCKフラグを設定し、ソケットを非ブロッキングにすることができる。

    シグナル駆動I/O。F_SETFLコマンドを用いてファイルのO_ASYNCフラグを設定し、ソケット状態の変化に対してSIGIOを発生させられる。

    #include <fcntl.h>
    
    int fcntl(int fd, int cmd, .../* int arg */);
    
    戻り値:成功ならcmdに依存した値、エラーなら-1

    ディスクリプタは、F_GETFLによる取得とF_SETFLによる設定が可能なフラグの集合を持つ。そのうち、ソケットに影響を与えるのは、次の2つ。

  • O_NONBLOCK : 非ブロッキングI/O

  • O_ASYNC : シグナル駆動I/O
  • fcntlを用いて、非ブロッキングI/O用の設定を行う例

    int flags;
    
    //ソケットを非ブロッキングにする
    
    //まず、現在の設定値を取得
    if ( (flag = fcntl(fd, F_GETFL, 0) ) < 0) {
      perror("fcntl");
      return -1;
    }
    
    //非ブロッキングI/Oの設定をフラグに追加
    flags |= O_NONBLOCK;
    
    //非ブロッキングI/Oを設定
    if (fcntl(fd, F_SETFL, flags) < 0) {
      perror("fcntl");
      return -1;
    }


    参考文献:UNIXネットワークプログラミング スティーブンズ