CAsyncSocket::SetSockOpt
ソケット オプションを設定します。
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 種類のソケット オプションがあります。ブール型のオプションを有効にするまたは機能または動作を無効にして、整数値または構造体を必要とするオプション。 ブール値のオプションを有効にするには、lpOptionValue に 0 以外の整数へのポインターを設定します。 無効にするには、lpOptionValue に 0 値の整数へのポインターを設定します。 ブール値のオプションの nOptionLen には、sizeof(BOOL) を設定します。 その他のオプションでは、オプションに必要な値を持つ整数または構造体へのポインターを lpOptionValue に設定します。さらに、その整数や構造体の長さを nOptionLen に設定します。
SO_LINGER は、ソケットのキューに未送信データが残っている場合に、そのソケットを閉じるために Close 関数を呼び出したときの動作を制御します。
既定では、使用中のローカル アドレスにソケットをバインドできません (「Bind」を参照してください)。 しかし、使用中のローカル アドレスにソケットをバインドすることにより、アドレスを "再利用" する方が望ましい場合もあります。 各接続は、ローカル アドレスとリモート アドレスを組み合わせて一意に識別されます。したがって、リモート アドレスが異なっていれば、同じローカル アドレスに 2 つのソケットをバインドしても問題ありません。
使いたいアドレスが既にほかのソケットで使われているため、ソケットに対して Bind を呼び出せないことを Windows ソケットの実装に通知するには、アプリケーションで Bind を呼び出す前にソケットに対して SO_REUSEADDR ソケット オプションを設定します。 オプションの時にのみ解釈されることに注意してください、バインドを呼び出します。したがって、既存のアドレスにはバインドするのには、ソケット オプションを設定する (無害ですが) 不要なは設定やオプションの後のリセット、バインド呼び出しがありません影響またはその他のソケット。
アプリケーションで TCP (伝送制御プロトコル) 接続での "接続保持" パケットの使用を Windows ソケットの実装に要求するには、SO_KEEPALIVE ソケット オプションを設定します。 Windows ソケットの実装は、キープア ライブの使用をサポートする必要があります。場合は、正確なセマンティクスは実装に固有ですが、RFC 1122 セクション 4.2.3.6 に従う必要があります。「インターネット ホストに関する要件-通信レイヤー。」"接続保持" の結果、接続がドロップしているときは、ソケットで実行中のすべての呼び出しはエラー コード 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 |
BOOL |
ソケットで、ブロードキャスト メッセージの転送を許可します。 |
SO_DEBUG |
BOOL |
デバッグ情報を記録します。 |
SO_DONTLINGER |
BOOL |
Close は未送信データの送信を待機しません。 このオプションを設定することは、l_onoff を 0 にして SO_LINGER を設定することと同じです。 |
SO_DONTROUTE |
BOOL |
ルートはありません。インタ フェースに直接送信します。 |
SO_KEEPALIVE |
BOOL |
接続保持パケットを送信します。 |
SO_LINGER |
struct LINGER |
未送信データがあるとき、Close を遅延します。 |
SO_OOBINLINE |
BOOL |
通常のデータ ストリームで帯域外データを受信します。 |
SO_RCVBUF |
int |
受信用のバッファー サイズを指定します。 |
SO_REUSEADDR |
BOOL |
ソケットを使用中のアドレスにバインドできるようにします。 「CAsyncSocket::Bind」を参照してください。 |
SO_SNDBUF |
int |
送信用のバッファー サイズを指定します。 |
TCP_NODELAY |
BOOL |
送信結合用の Nagle アルゴリズムを無効にします。 |
次の BSD (Berkeley Software Distribution) オプションは SetSockOpt ではサポートしません。
値 |
次のように入力します。 |
説明 |
---|---|---|
SO_ACCEPTCONN |
BOOL |
ソケットはリスナーです。 |
SO_ERROR |
int |
エラー状態を取得し、クリアします。 |
SO_RCVLOWAT |
int |
低水位マークを受信します。 |
SO_RCVTIMEO |
int |
タイムアウトを受信します。 |
SO_SNDLOWAT |
int |
低水位マークを送信します。 |
SO_SNDTIMEO |
int |
タイムアウトを送信します。 |
SO_TYPE |
int |
ソケットの型です。 |
IP_OPTIONS |
|
IP ヘッダーにオプション フィールドを設定します。 |
必要条件
**ヘッダー:**afxsock.h