CAsyncSocket::SetSockOpt
更新 : 2007 年 11 月
ソケット オプションを設定します。
BOOL SetSockOpt(
int nOptionName,
const void* lpOptionValue,
int nOptionLen,
int nLevel = SOL_SOCKET
);
パラメータ
nOptionName
値を設定するソケット オプション。lpOptionValue
要求するオプションに指定する値を持つバッファへのポインタ。nOptionLen
lpOptionValue バッファのバイト単位のサイズ。nLevel
オプションが定義されるレベル。サポートされるレベルは SOL_SOCKET と IPPROTO_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_DONTLINGER、SO_KEEPALIVE、SO_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