ソケットオプション
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つ。
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; }