次の方法で共有


CAsyncSocket::SetSockOpt

更新 : 2007 年 11 月

ソケット オプションを設定します。

BOOL SetSockOpt(
   int nOptionName,
   const void* lpOptionValue,
   int nOptionLen,
   int nLevel = SOL_SOCKET 
);

パラメータ

  • nOptionName
    値を設定するソケット オプション。

  • lpOptionValue
    要求するオプションに指定する値を持つバッファへのポインタ。

  • nOptionLen
    lpOptionValue バッファのバイト単位のサイズ。

  • nLevel
    オプションが定義されるレベル。サポートされるレベルは SOL_SOCKETIPPROTO_TCP だけです。

戻り値

正常終了した場合は 0 以外を返します。それ以外の場合は 0 を返します。GetLastError を呼び出すと、固有のエラー コードを取得できます。このメンバ関数では、次のエラーが発生します。

  • WSANOTINITIALISED   この API を使う前に AfxSocketInit の呼び出しが正常終了していることが必要です。

  • WSAENETDOWN   Windows ソケットの実装が、ネットワーク サブシステムの異常を検出しました。

  • WSAEFAULT   lpOptionValue がプロセスのアドレス空間の有効な部分を指していません。

  • WSAEINPROGRESS   実行中の Windows ソケット呼び出しがブロッキングされています。

  • WSAEINVAL   nLevel が無効か、または lpOptionValue 内の情報が無効です。

  • WSAENETRESET   SO_KEEPALIVE が設定されているときに、接続がタイムアウトしました。

  • WSAENOPROTOOPT   オプションが無効またはサポートされていません。特に SO_BROADCAST オプションは SOCK_STREAM 型のソケットでサポートしていません。また、SO_DONTLINGERSO_KEEPALIVESO_LINGER、および SO_OOBINLINE オプションは、SOCK_DGRAM 型のソケットではサポートされていません。

  • WSAENOTCONN   SO_KEEPALIVE が設定されているときに、接続がリセットされました。

  • WSAENOTSOCK   記述子がソケットではありません。

解説

SetSockOpt は、すべての型の、任意の状態のソケットに関連付けられたソケット オプションの現在値を設定します。オプションは、複数のプロトコル レベルに存在できますが、ここで指定するオプションは、最上位の "ソケット" レベルに存在するオプションだけです。オプションは、ソケット操作に影響します。ソケット操作とは、通常のデータ ストリームで緊急データを受け取れるかどうか、ソケット上でブロードキャスト メッセージを送信できるかどうかを指します。

ソケット オプションには 2 つの型があります。1 つは、機能や動作を有効、無効にするブール値のオプションです。もう 1 つは、整数値または構造体を必要とするオプションです。ブール値のオプションを有効にするには、lpOptionValue に 0 以外の整数へのポインタを設定します。無効にするには、lpOptionValue に 0 値の整数へのポインタを設定します。ブール値のオプションの nOptionLen には、sizeof(BOOL) を設定します。その他のオプションでは、オプションに必要な値を持つ整数または構造体へのポインタを lpOptionValue に設定します。さらに、その整数や構造体の長さを nOptionLen に設定します。

SO_LINGER は、ソケットのキューに未送信データが残っている場合に、そのソケットを閉じるために Close 関数を呼び出したときの動作を制御します。

既定では、使用中のローカル アドレスにソケットをバインドできません (「Bind」を参照してください)。しかし、使用中のローカル アドレスにソケットをバインドすることにより、アドレスを "再利用" する方が望ましい場合もあります。各接続は、ローカル アドレスとリモート アドレスを組み合わせて一意に識別されます。したがって、リモート アドレスが異なっていれば、同じローカル アドレスに 2 つのソケットをバインドしても問題ありません。

使いたいアドレスが既にほかのソケットで使われているため、ソケットに対して Bind を呼び出せないことを Windows ソケットの実装に通知するには、アプリケーションで Bind を呼び出す前にソケットに対して SO_REUSEADDR ソケット オプションを設定します。このオプションは、Bind を呼び出すときにのみ解釈されます。つまり、既存のアドレスにバインドしないときは、設定する必要はありません。また、設定しても悪影響を及ぼすことはありません。さらに、Bind を呼び出した後に設定、解除しても、このソケットやほかのソケットに影響を及ぼすことはありません。

アプリケーションで TCP (伝送制御プロトコル) 接続での "接続保持" パケットの使用を Windows ソケットの実装に要求するには、SO_KEEPALIVE ソケット オプションを設定します。Windows ソケットの実装で接続保持の使用をサポートする必要はありません。接続保持の使用をサポートする場合、正確な意味付けは実装ごとに固有ですが、「RFC 1122 Requirements for Internet Hosts - Communication Layers」の「4.2.3.6 TCP Keep-Alives」に従う必要があります。"接続保持" の結果、接続がドロップしているときは、ソケットで実行中のすべての呼び出しはエラー コード WSAENETRESET を返します。さらにその後の呼び出しは WSAENOTCONN を返し、異常終了します。

TCP_NODELAY オプションは、Nagle アルゴリズムを無効にします。Nagle アルゴリズムは小さなパケットの送信数を減らすために使います。このアルゴリズムではパケットの送信数を減少させるために、パケットの全サイズが送信できるようになるまでホストで未応答の送信データをバッファリングします。アプリケーションによってはこのアルゴリズムが性能を低下させることがあります。そのときは、TCP_NODELAY を使ってこのアルゴリズムをオフにします。TCP_NODELAY を設定するとネットワークの性能に重大な悪影響を及ぼすことがあるため、アプリケーションの作成者は、TCP_NODELAY を設定することによる影響度をよく理解し、特に必要でない限り設定しないでください。サポートされているソケット オプションの中で、TCP_NODELAY のみが IPPROTO_TCP レベルを使っています。ほかのオプションはすべて SOL_SOCKET レベルを使います。

アプリケーションで SO_DEBUG オプションを設定すると、Windows ソケットの実装はデバッグ情報を出力できます。

SetSockOpt では、次のオプションをサポートしています。型は、lpOptionValue によってアドレスが指定されるデータの型を示します。

説明

SO_BROADCAST

ブール型

ソケットで、ブロードキャスト メッセージの転送を許可します。

SO_DEBUG

ブール型

デバッグ情報を記録します。

SO_DONTLINGER

ブール型

Close は未送信データの送信を待機しません。このオプションを設定することは、l_onoff を 0 にして SO_LINGER を設定することと同じです。

SO_DONTROUTE

ブール型

ルーティングしません。直接インターフェイスに送信します。

SO_KEEPALIVE

ブール型

接続保持パケットを送信します。

SO_LINGER

struct LINGER

未送信データがあるとき、Close を遅延します。

SO_OOBINLINE

ブール型

通常のデータ ストリームで帯域外データを受信します。

SO_RCVBUF

int

受信用のバッファ サイズを指定します。

SO_REUSEADDR

ブール型

ソケットを使用中のアドレスにバインドできるようにします。「CAsyncSocket::Bind」を参照してください。

SO_SNDBUF

int

送信用のバッファ サイズを指定します。

TCP_NODELAY

ブール型

送信データをまとめて送るための Nagle アルゴリズムを無効にします。

次の BSD (Berkeley Software Distribution) オプションは SetSockOpt ではサポートしません。

説明

SO_ACCEPTCONN

ブール型

ソケットはリスナです。

SO_ERROR

int

エラー状態を取得し、クリアします。

SO_RCVLOWAT

int

低水位マークを受信します。

SO_RCVTIMEO

int

タイムアウトを受信します。

SO_SNDLOWAT

int

低水位マークを送信します。

SO_SNDTIMEO

int

タイムアウトを送信します。

SO_TYPE

int

ソケットの型です。

IP_OPTIONS

 

IP ヘッダーにオプション フィールドを設定します。

必要条件

ヘッダー : afxsock.h

参照

参照

CAsyncSocket クラス

階層図

CAsyncSocket::AsyncSelect

CAsyncSocket::Bind

CAsyncSocket::Create

CAsyncSocket::GetSockOpt

CAsyncSocket::IOCtl

その他の技術情報

CAsyncSocket のメンバ