setsockopt
更新日2007年03月03日
参照 http://msdn2.microsoft.com/en-us/library/ms740476.aspx

機能
setsockopt 関数は、ソケットオプションをセットします。

書式
int setsockopt(
  SOCKET s,
  int level,
  int optname,
  const char* optval,
  int optlen
);
引数
s [入] ソケットを識別する記述子。
level [入] オプションが定義されるレベル (たとえば、SOL_SOCKET)。
optname [入] 値がセットされることになっているソケットオプション (たとえば、SO_BROADCAST)。 optname パラメータは指定された level の中で定められるソケットオプションでなければなりません、あるいは、ふるまいは未定義です。
optval [入] 要求されたオプションのための値が指定されるバッファへのポインター。
optlen [入] バイト数による、optval バッファのサイズ。
戻り値
エラーが発生しないならば、setsockopt はゼロを戻します。 さもなければ、SOCKET_ERRORの値が戻されます、 そして、特定のエラーコードは、WSAGetLastError を呼ぶことによって検索されることができます。

エラーコード 意味
WSANOTINITIALISED
この関数を使用する前に、WSAStartup を成功させておく必要があります。
WSAENETDOWN
ネットワークサブシステムは失敗しました。
WSAEFAULT
optval パラメータはプロセスアドレス空間の一部として有効ではありません、 あるいは、optlen パラメータは小さすぎます。
WSAEINPROGRESS
Windows Sockets 1.1 が呼び出すブロッキングは進行中です、あるいは、 サービスプロバイダはコールバック 関数をまだ処理しています。
WSAEINVAL
level パラメータは有効ではありません、あるいは、 optval パラメータの情報は有効ではありません。
WSAENETRESET
SO_KEEPALIVE がセットされる時、接続はタイムアウトします。
WSAENOPROTOOPT
オプションは、指定されたプロバイダーまたはソケットのために知られていないか、サポートされていないです。 (参照 SO_GROUP_PRIORITY 制限)
WSAENOTCONN
SO_KEEPALIVEがセットされるとき、接続はリセットされました。
WSAENOTSOCK
記述子はソケットではありません。

注釈

どんな型の、どんな状態のソケットと関連したソケットオプション用のカレント値を setsockopt 関数は、セットします。 オプションが複数のプロトコルレベルに存在することができるけれども、 彼らは最上ソケットレベルで常にいます。 オプションはソケット操作に影響を及ぼします、 促進されたデータ (たとえばOOBデータ) が通常のデータストリームで受け取られるかどうかのような、 そして、ブロードキャストメッセージがソケットで送られることができるかどうかに関係なく。

ノート   もし setsockopt 関数が bind 関数の前に呼ばれるならば、 bind が起こるまで、TCP/IP オプションは TCP/IP と照合されません。 この場合、 setsockopt 関数呼び出しは、常に成功します、 しかし、bind 関数呼び出しは、 失敗している初期の setsockopt のため、失敗することがありえます。

ノート   もしソケットが開かれるならば、setsockopt 呼び出しはなされます、 Windows Socketsは、潜在的な bind 関数呼び出しを実行します。

2種類のソケットオプションがあります: 特徴またはふるまいを可能または不可にするブールオプションと整数値または構造を必要とするオプション。 ブールオプションを可能にするために、optval パラメータは、ゼロ以外の整数を指します。 オプションを使用不能にするために、optvalはゼロと等しい整数を指します。 optlen パラメータは、ブールオプションのために sizeof(int) と等しくなければなりません。 optval はオプションのために望ましい値を含む整数または構造を指します、 そして、optlen は整数または構造の長さです。

以下のオプションは、setsockopt のためにサポートされます。 これらのオプションのデフォルト値のために、説明を見てください。 optval によってアドレスされるデータの型を、型は識別します。

ソケットオプションの詳細については、Socket Options を見てください。


level = SOL_SOCKET

意味
SO_BROADCAST
BOOL
ブロードキャストメッセージの転送と受領を有効にします。
SO_CONDITIONAL_ACCEPT
BOOL
WSAAccept 状態関数が呼ばれるまで、ソケットが接続の承認を遅らせる事を可能にします。
SO_DEBUG
BOOL
デバッグ情報を記録します。
SO_DONTLINGER
BOOL
未送付のデータが送られるためにブロッククローズ待ちしません。 このオプションをセットすることは、 l_onoff にゼロにセットすると共に SO_LINGER をセットする事に等しいです
SO_DONTROUTE
BOOL
ルーティング無効: インターフェースに直接送ってください。 このオプションがセットされるとき、 それは成功するが、AF_INET と AF_INET6 ソケットのために無視されます。 このオプションは、ATMソケットではサポートされません (エラーの結果)。
SO_GROUP_PRIORITY
int
予約済み。
SO_KEEPALIVE
BOOL
keep-alives を送ります。 ATM ソケットではサポートされていません (エラーの結果)。
SO_LINGER
LINGER
もし未送付のデータが存在するならば、クローズ時に長引きます。
SO_OOBINLINE
BOOL
通常のデータストリームで OOB データを受信します。 (この話題に関する議論については、 セクションProtocol Independent Out-Of-band Dataを見てください。)
SO_RCVBUF
int
トータルのソケット単位バッファスペースを受信用に予約済である事を指示します これは SO_MAX_MSG_SIZE とは無関係で、 TCP 受信ウィンドウのサイズと必ずしも一致すると言う訳ではありません。
SO_REUSEADDR
BOOL
ソケットをすでに使用中であるアドレスに密接に結びつかせます。 (参照 bind。) ATM ソケットでは適用できない。
SO_EXCLUSIVEADDRUSE
BOOL
排他アクセス用にソケットに結び付られる事を有効にします。 管理の特権を必要としません。
SO_SNDBUF
int
送信用にトータルのソケット単位のバッファスペースを予約済みである事を指示します。 これは SO_MAX_MSG_SIZE とは無関係で、 TCP 送信ウインドウのサイズと、必ずしも一致するというわけではありません。
SO_UPDATE_ACCEPT_CONTEXT
int
受け入れているソケットのコンテキストと共に受け入れているソケットを更新します。
PVD_CONFIG
Service Provider Dependent
ソケット s と共に備えてサービスプロバイダのために、 このオブジェクトは構成情報をたくわえます。 このデータ構造の正確なフォーマットは、サービスプロバイダが指定します。

level = IPPROTO_TCP

意味
TCP_NODELAY
BOOL
まとめられている送信用に、ネーグルアルゴリズムを無効にします。
1     Windows Sockets 1.1 で旧版互換性のために含まれます

level = NSPROTO_IPX

ノート   Windows NT はすべての IPX オプションをサポートします。 Windows Me/98/95 は以下のオプションだけをサポートします:

IPX_PTYPE
IPX_FILTERPTYPE
IPX_DSTYPE
IPX_RECVHDR
IPX_MAXSIZE (getsockopt 関数と共に使用されます)
IPX_ADDRESS (getsockopt 関数と共に使用されます)


意味
IPX_PTYPE
int
IPX パケットタイプをセットします。
IPX_FILTERPTYPE
int
受信フィルターパケットタイプをセットします
IPX_STOPFILTERPTYPE
int
IPX_FILTERTYPE と共にフィルタータイプセットするフィルタリングをストップします。
IPX_DSTYPE
int
すべてのパケット送信上にて SPX ヘッダのデータストリームフィールド値をセットします。
IPX_EXTENDED_ADDRESS
BOOL
拡張されたアドレッシングが有効であるかどうかに関係なくセットします。
IPX_RECVHDR
BOOL
受信ヘッダ上にてプロトコルヘッダがアップ送信するかどうかに関係なくセットします。
IPX_RECEIVE_BROADCAST
BOOL
ソケット上でブロードキャストパケットが良く似ている事を指摘します。 デフォルトにより TRUE にセットします。 ブロードキャストを使用しない、アプリケーションは、 ベターシステムパフォーマンスのために、これを FALSE にセットしなければなりません。
IPX_IMMEDIATESPXACK
BOOL
SPX 接続に ACK を送る前に遅れないように指示します。 back-and-forth トラフィックとは別に、アプリケーションは、 パフォーマンス上げるために、これを TRUE にセットしなければなりません。

setsockopt 用にサポートされていない BSD オプションを以下の表に示します。

意味
SO_ACCEPTCONN
BOOL
ソケットは聞き取り中です。
SO_RCVLOWAT
int
低いウォーターマークを受信します。
SO_RCVTIMEO
int
ミリ秒のタイムアウトを受信します (Windows Sockets 2 のマイクロソフト実装において利用できます)。
SO_SNDLOWAT
int
低いウォーターマークを送信します。
SO_SNDTIMEO
int
ミリ秒のタイムアウトを送信します (Windows Sockets 2 のマイクロソフト実装において利用できます)。
SO_TYPE
int
ソケットの型

SO_CONDITIONAL_ACCEPT
WSAAccept の後、状態関数が呼ばれるまで、 このソケットオプションを TRUE に設定することは接続の承認を遅延します。 もし FALSE ならば、状態関数が呼ばれる前に、接続は受け入れられるかもしれません、 しかし、状態関数が呼び出しを拒絶するならば、接続は切れます。 このオプションは listen 関数を呼ぶ前にセットされなければなりません、 さもなければ、WSAEINVAL が戻されます。 TCP と ATM のためにのみ、SO_CONDITIONAL_ACCEPT はサポートされます。

TCPは、デフォルトで SO_CONDITIONAL_ACCEPT を FALSE にセットします、 したがって、デフォルトで、WSAAccept 状態関数が呼ばれる前に、 接続は受け入れられます。 TRUE にセットされるとき、 条件つきの決定は TCP 接続タイムアウトの中でなされなければなりません。 CF_DEFER 接続は、タイムアウトをまだ受けます。

ATM は、デフォルトで SO_CONDITIONAL_ACCEPT を TRUE にセットします。


SO_DEBUG
SO_DEBUG オプションがアプリケーションでセットされるならば、 Windows Sockets サービスプロバイダは出力デバッグ情報を供給するのを奨励されます (しかし、必須ではありません)。 デバッグ情報を生み出すための仕組みとそれがとる形は、この文書の範囲の向こうにあります。

SO_GROUP_PRIORITY
ソケットグループの将来の利用のために予約されています。 グループプライオリティーは、 ソケットグループ内で他のソケットと比較して指定されたソケットの相対的なプライオリティーを示します。 最も高いプライオリティーを示すのはゼロで、値は負でない整数です。 プライオリティー値は、 不十分な資源がどれくらい潜在的に割り当てられなければならないかについて、 下にあるサービスプロバイダに関する手がかりを代表します。 たとえば、 2つ以上のソケット両方がデータを送る準備ができているときはいつでも、 最も高いプライオリティーソケットは(SO_GROUP_PRIORITY のための最も低い価値)、 彼らの相対的なプライオリティーによって、 順番に残りにサービスを提供して、 最初にサービスされなければなりません。

SO_KEEPALIVE
アプリケーションは、TCP/IP プロバイダーが SO_KEEPALIVE ソケットオプションを有効にすることによって TCP 接続に関して keep-alive パケットの使用を可能にすると要求する事ができます。 Windows Sockets プロバイダーは、keep-alives の使用をサポートする必要はありません。 それがそうするならば、 正確な意味論は実装に特有であるが、IETF ウェブサイトで利用できる RFC 1122 で指定される インターネットホスト-通信層のための要求 の上で、セクション 4.2.3.6 にかなわなければなりません。

もし接続が keep-alives の結果として落とされるならば、エラーコード WSAENETRESET はソケットで進行中にどんな呼び出しにでも戻されます、 そして、どんな以降の呼び出しでも、WSAENOTCONN で失敗します。

もし SO_KEEPALIVE と共に TCP ソケットのために keep-alive が有効であるならば、 これらの値は、 SIO_KEEPALIVE_VALS オプションと共にWSAIoctl 関数呼び出しによって変わらなかった限り、 keep-alive タイムアウトとインターバルの間のために、 デフォルト TCP セッティングは使用されます。 TCP ソケットが初期化される時に、 keep-alive タイムアウトを2時間、そして、keep-alive インターバルを1秒に、 デフォルトセッティングではセットします。 最初の keep-alive なパケットが送られるまで、 keep-alive なタイムアウトは活動なしで、ミリ秒に、タイムアウトを指定します。 承認が受け取られないならば、連続した keep-alive なパケットが送られる時の間で、 ミリ秒には、keep-alive な間隔は、間隔を指定します。 keep-aliveな調査の数は、変わることができなくて、10にセットされます。


SO_LINGER
ソケット上にて、未送付のデータが待ち行列に入れられる、そして、 closesocket は実行される時、 SO_LINGER オプションは持って行くアクションを制御します。 closesocket の意味論に、SO_LINGER セッティングが影響する、そしてその事の、 方法の説明については、closesocket を参照してください。 アプリケーションは、適切にセットされるこれらのメンバー l_onoffl_linger とともに LINGER 構造体 (optval パラメータにより指される) を作成することによって、 望ましいふるまいをセットします。

SO_REUSEADDR
デフォルトで、ソケットはすでに使用中であるローカルアドレスに束ねられる事を出来ません。 しかし、時には、そのようにアドレスを再利用する必要があります。 ローカルとリモートアドレスの組み合わせにより、 あらゆる接続はユニークに識別されるから、 リモートアドレスが異なる限り、同じ長さの同一のローカルアドレスに、 2つのソケットを結び付けられることに関する問題はありません。 求められたアドレスが既に他のソケットによって使用中であるので、 ソケット上での bind が認められなければならない事を、 Windows Sockets プロバイダーに知らせます、 アプリケーションは、bind を出す前に、 SO_REUSEADDR ソケットオプションをソケットに設定しなければなりません。 bind の時点だけに、オプションは解釈されます。 それ故に、存在しているアドレスに結び付けられない処の、 ソケット上にてオプションをセットする事は、不必要で無害です。 bind の後でオプションをセットするか、リセットすることは、 これまたは他のどのソケットにも影響を及ぼしません。

SO_RCVBUF and SO_SNDBUF
Windows Sockets 実装が SO_RCVBUF と SO_SNDBUF オプションをサポートする時、 アプリケーションは、異なるバッファサイズを要求する事が出来ます (より大きいかより小さい)。 実装が要求された全体の量を提供出来なかった時に、 setsockopt への呼び出しは公平に成功出来ます。 実際に提供されるバッファサイズをチェックするために、 同じオプションで getsockopt を、 アプリケーションは呼ばなければなりません。

SO_RCVTIMEO and SO_SNDTIMEO
recv 関数を使用する時、 もし SO_RCVTIMEO で指定される期間の間データが到着しないならば、 recv 関数は完了します。 Windows 2000 より前の Windows 版で、 その後受け取られるどんなデータでも、WSAETIMEDOUT で失敗します。 Windows 2000 とそれ以後で、 もし SO_RCVTIMEO で指定される期間内にデータが到着しないならば、 recv 関数は、WSAETIMEDOUT を戻します、 そして、もしデータが受信されたならば、recv は SUCCESS を戻します。

もしソケット上にて送受信操作がタイムアウトするならば、 ソケットの状態は不確定です、そして、使用されてはなりません; この状態の TCP ソケットには、データ損失の可能性があります、 キャンセルされる操作が出来た時から、同時に操作は完了されました。


PVD_CONFIG
s パラメータで指定されたソケットと関連するサービスプロバイダ用に構成情報を、 このオブジェクトは蓄えます。 このデータ構造の正確なフォーマットは、各々のサービスプロバイダに特有です。

TCP_NODELAY
TCP_NODELAY オプションは、TCP/IP サービスプロバイダに特有です。 もし TCP_NODELAY オプションが有効 (そして、その逆) ならば、 ネーグルアルゴリズムは無効です。既に飛行中の認められないデータある、または、 フルサイズのパケットを送信可能なバッファリング送信データが出来る、その時に、 プロセスはバッファリング送信データを伴います。 TCP/IP サービスプロバイダがデフォルトでネーグルアルゴリズムを有効にする事は、 とても推奨されます、 そして、大多数のアプリケーションプロトコルのために、ネーグルアルゴリズムは、 有効なパフォーマンス向上を加える事が出来ます。 しかし、若干のアプリケーションのために、このアルゴリズムは、 パフォーマンスを妨げることができます、 そして、TCP_NODELAY はそれをオフにするのに用いられることができます。 これらは、多くの小さなメッセージが送られるアプリケーションです、 そして、メッセージの間の時間遅れは、維持されます。 TCP_NODELAY をセットすることがネットワークとアプリケーション性能に重要な否定的 な影響を及ぼすことができるのでそうすることの影響が十分理解されて、 希望されない限り、アプリケーション記述者は TCP_NODELAY をセットしてはなりません。

Example Code
以下に、setsockopt 関数の使用例を示します。 [winsock2setsockopt_example1.c]
/*
 * file:winsock2setsockopt_example1.c
 * The setsockopt function sets a socket option.
 * 参照 http://msdn2.microsoft.com/en-us/library/ms740476.aspx
 */
#include <stdio.h>
#include <winsock2.h>

int main(int argc, char *argv[])
{
    /*
     * 変数を宣言
     */
    WSADATA             wsaData;
    SOCKET              ListenSocket    = INVALID_SOCKET;
    struct sockaddr_in  service;
    int                 iResult         = 0;
    struct hostent      *thisHost       = NULL;
    char                *ip             = NULL;
    u_short             port            = 0;
    BOOL                boOptVal        = FALSE;
    int                 iOptLen         = 0;
    int                 iOptVal         = 0;
    
    /*
     * winsockを初期化
     */
    iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
    if (iResult)
    {
        printf("WSAStartup() Failed.\n");
        return 1;
    }
    
    /*
     * 聞き取り用ソケットを作成
     */
    ListenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (ListenSocket == INVALID_SOCKET)
    {
        printf("socket() Failed.\n");
        WSACleanup();
        return 1;
    }
    
    /*
     * ローカルIPアドレスとポート27015にソケットをバインドする
     */
    port = 27015;
    thisHost = gethostbyname("");
    if (thisHost == NULL)
    {
        printf("gethostbyname() Failed.\n");
        closesocket(ListenSocket);
        WSACleanup();
        return 1;
    }
    ip = inet_ntoa(*(struct in_addr *)*thisHost->h_addr_list);
    
    service.sin_family = AF_INET;
    service.sin_addr.s_addr = inet_addr(ip);
    service.sin_port = htons(port);
    
    iResult = bind(ListenSocket, (SOCKADDR *)&service, sizeof(service));
    if (iResult == SOCKET_ERROR)
    {
        printf("bind() Failed.\n");
        closesocket(ListenSocket);
        WSACleanup();
        return 1;
    }
    
    /*
     * 変数の初期化と、setsockopt呼び出し。
     * SO_KEEPALIVE パラメータは、ソケットがセッションで keepalive メ
     * ッセージを送らせるソケットオプションです。SO_KEEPALIVE ソケット
     * オプションは、setsockopt 関数を通過できるブール値を要求します。
     * もし TRUE ならば、構成されるソケットは keepalive メッセージを送
     * ります、もし FALSE ならば、構成されるソケットは keepalive メッ
     * セージを送りません。コードのこの部分は、getsockopt 関数を使用し
     * ているソケット上にて、SO_KEEPALIVE の状態をチェックすることによ
     * って、setsockopt 関数をテストします。
    */
    boOptVal    = TRUE;
    
    iOptLen = sizeof(int);
    iResult = getsockopt(ListenSocket, SOL_SOCKET, SO_KEEPALIVE
            , (char *)&iOptVal, &iOptLen);
    if (iResult != SOCKET_ERROR)
    {
        printf("SO_KEEPALIVE value: %ld\n", iOptVal);
    }
    
    iOptLen = sizeof(BOOL);
    iResult = setsockopt(ListenSocket, SOL_SOCKET, SO_KEEPALIVE
            , (char *)&boOptVal, iOptLen);
    if (iResult != SOCKET_ERROR)
    {
        printf("Set SO_KEEPALIVE: ON\n");
    }

    iOptLen = sizeof(int);
    iResult = getsockopt(ListenSocket, SOL_SOCKET, SO_KEEPALIVE
            , (char *)&iOptVal, &iOptLen);
    if (iResult != SOCKET_ERROR)
    {
        printf("SO_KEEPALIVE value: %ld\n", iOptVal);
    }
    
    closesocket(ListenSocket);
    WSACleanup();
    return 0;
}

IrDA ソケットのためのノート

以下を覚えておいてください:

  • Af_irda.h ヘッダファイルは、明確にインクルードされなければなりません。
  • IrDA は、以下のセット可能なソケットオプションを提供します:
    意味
    IRLMP_IAS_SET
    *IAS_SET
    IAS 属性をセットします

IRLMP_IAS_SET ソケットオプションは、アプリケーションが一つのクラスの一つの属性 をローカルの IAS でセットする事を有効にします。 アプリケーションは、属性と属性タイプのセットへクラスを指定します。 アプリケーションは、必要なサイズのバッファを渡されたパラメータに割り当てることになっています。

IrDA は、IrDA に基づく情報を格納するIASデータベースを提供します。 IAS データベースへの限られたアクセスは、Windows Sockets 2 interface を通して手に入ります、 しかし、そのようなアクセスは、アプリケーションにより通常用いられません、 そして、主に Windows Sockets 2 IrDA 協定で素直でない非Windowsデバイスへの接続をサポートするために存在します。


以下の構造体、 IAS_SET、 ローカル IAS データベースを管理するために、IRLMP_IAS_SET setsockopt オプションで使われます:
typedef struct _IAS_SET {
    char      irdaClassName[IAS_MAX_CLASSNAME];
    char      irdaAttribName[IAS_MAX_ATTRIBNAME];
    u_long    irdaAttribType;
    union
    {
              LONG irdaAttribInt;
              struct
              {
                   u_short   Len;
                   u_char    OctetSeq[IAS_MAX_OCTET_STRING];
              } irdaAttribOctetSeq;
              struct
              {
                   u_char    Len;
                   u_char    CharSet;
                   u_char    UsrStr[IAS_MAX_USER_STRING];
              } irdaAttribUsrStr;
    } irdaAttribute;
} IAS_SET, *PIAS_SET, FAR *LPIAS_SET;

以下の構造体、 IAS_QUERY、 同志の IAS データベースについてたずねるために、IRLMP_IAS_QUERY setsockopt オプションで使われます:
typedef struct _WINDOWS_IAS_QUERY {
        u_char   irdaDeviceID[4];
        char     irdaClassName[IAS_MAX_CLASSNAME];
        char     irdaAttribName[IAS_MAX_ATTRIBNAME];
        u_long   irdaAttribType;
        union
        {
                  LONG    irdaAttribInt;
                  struct
                  {
                          u_long  Len;
                          u_char  OctetSeq[IAS_MAX_OCTET_STRING];
                  } irdaAttribOctetSeq;
                  struct
                  {
                          u_long  Len;
                          u_long  CharSet;
                          u_char  UsrStr[IAS_MAX_USER_STRING];
                  } irdaAttribUsrStr;
        } irdaAttribute;
} IAS_QUERY, *PIAS_QUERY, FAR *LPIAS_QUERY;

多くの SO_ レベルソケットオプションは、IrDA に意味がありません。 SO_LINGER だけは、特別にサポートされます。

ノート   setsockopt は、Windows NT 4.0, Windows 95, そして Windows 98 プラットフォーム上にて bind する前に呼ばれなければなりません。


要求環境
Client Requires Windows Vista, Windows XP, Windows 2000 Professional, Windows NT Workstation, Windows Me, Windows 98, or Windows 95.
Server Requires Windows Server "Longhorn", Windows Server 2003, Windows 2000 Server, or Windows NT Server.
Header Declared in Winsock2.h.
Library Use libws2_32.a
DLL Requires Ws2_32.dll.

参照
bind
getsockopt
ioctlsocket
socket
Socket Options
Winsock Functions
WSAAsyncSelect
WSAEventSelect
WSAIoctl