LPWSPSETSOCKOPT
コールバックシグネチャ
INT LPWSPSETSOCKOPT(
SOCKET s,
INT level,
INT optname,
LPSTR optval,
INT optlen,
INT* lpErrno
);パラメーター
| フィールド | 型 | 説明 |
|---|---|---|
| s | SOCKET | ソケットを識別する記述子です。 |
| level | INT | オプションが定義されるレベルです。サポートされるレベルには SOL_SOCKET が含まれます。詳細については、Winsock Annexes を参照してください。 |
| optname | INT | 値を設定する対象のソケットオプションです。 |
| optval | LPSTR | 要求されたオプションの値が格納されているバッファーへのポインターです。 |
| optlen | INT | optval バッファーのサイズ (バイト単位) です。 |
| lpErrno | INT* | エラーコードへのポインターです。 |
公式ドキュメント
LPWSPSetSockOpt 関数は、ソケットオプションを設定します。
戻り値
エラーが発生しなかった場合、LPWSPSetSockOpt は 0 を返します。それ以外の場合は SOCKET_ERROR が返され、具体的なエラーコードは lpErrno で取得できます。
| エラーコード | 意味 |
|---|---|
| ネットワークサブシステムに障害が発生しました。 | |
| optval がプロセスのアドレス空間の有効な部分にないか、optlen パラメーターが小さすぎます。 | |
| コールバックの処理中に関数が呼び出されました。 | |
| ブロッキング Windows Sockets 呼び出しが進行中であるか、サービスプロバイダーがコールバック関数をまだ処理しています。 | |
| level が有効でないか、optval 内の情報が有効ではありません。 | |
| 操作の進行中にキープアライブ動作が障害を検出したため、接続が切断されました。 | |
| 指定されたプロバイダーでは、オプションが不明であるかサポートされていません。 | |
| SO_KEEPALIVE が設定されている状態で、接続がリセットされました。 | |
| 記述子がソケットではありません。 |
解説(Remarks)
LPWSPSetSockOpt 関数は、任意の種類および任意の状態のソケットに関連付けられたソケットオプションの現在の値を設定します。オプションは複数のプロトコルレベルに存在し得ますが、常に最上位のソケットレベルに存在します。オプションは、ソケット上でブロードキャストメッセージを送信できるかどうかなど、ソケットの動作に影響します。
ソケットオプションには 2 種類あります。機能や動作を有効または無効にするブール型のオプションと、整数値または構造体を必要とするオプションです。ブール型のオプションを有効にするには、optval が 0 以外の整数を指すようにします。オプションを無効にするには、optval が 0 に等しい整数を指すようにします。ブール型のオプションの場合、optlen パラメーターは sizeof (int) と等しくする必要があります。その他のオプションでは、optval はそのオプションに設定する値を格納した整数または構造体を指し、optlen はその整数または構造体の長さになります。
ソケットオプションの詳細については、Socket Options を参照してください。
level = SOL_SOCKET
| 値 | 型 | 意味 |
|---|---|---|
| SO_BROADCAST | BOOL | ソケット上でのブロードキャストメッセージの送受信を有効にします。 |
| SO_DEBUG | BOOL | デバッグ情報を記録します。 |
| SO_DONTLINGER | BOOL | 予約されています。 |
| SO_DONTROUTE | BOOL | ルーティングを無効にし、インターフェイスへ直接送信します。このソケットオプションの設定は、AF_INET ソケットでは成功しますが無視されます。AF_INET6 ソケットでは WSAENOPROTOOPT で失敗します。このオプションは ATM ソケットではサポートされません (エラーになります)。 |
| SO_GROUP_PRIORITY | int | 予約されています。 |
| SO_KEEPALIVE | BOOL | キープアライブを送信します。ATM ソケットではサポートされません (エラーになります)。 |
| SO_LINGER | struct linger | 未送信のデータが残っている場合、クローズ時に待機 (linger) します。 |
| SO_OOBINLINE | BOOL | OOB データを通常のデータストリーム内で受信します。 |
| SO_RCVBUF | int | 受信用にソケットごとに予約されるバッファー領域の合計を指定します。これは SO_MAX_MSG_SIZE とは無関係であり、TCP 受信ウィンドウのサイズと必ずしも対応しません。 |
| SO_REUSEADDR | BOOL | 既に使用されているアドレスへのソケットのバインドを許可します (Bind を参照)。ATM ソケットには適用されません。 |
| SO_SNDBUF | int | 送信用にソケットごとに予約されるバッファー領域の合計を指定します。これは SO_MAX_MSG_SIZE とは無関係であり、TCP 送信ウィンドウのサイズと必ずしも対応しません。 |
| PVD_CONFIG | Service Provider Dependent | このオブジェクトは、ソケット s に関連付けられたサービスプロバイダーの構成情報を格納します。このデータ構造の正確な形式は、サービスプロバイダー固有です。 |
サポートされていないオプションを指定して LPWSPGetSockopt を呼び出すと、lpErrno にエラーコード WSAENOPROTOOPT が返されます。
-
Windows Sockets サービスプロバイダーは、Windows Sockets SPI クライアントによって SO_DEBUG オプションが設定された場合にデバッグ情報を出力することが推奨されますが、必須ではありません。デバッグ情報を生成する仕組みとその形式は、この仕様の対象外です。
-
予約されています。
-
Windows Sockets SPI クライアントは、SO_KEEPALIVE ソケットオプションを有効にすることで、TCP 接続でキープアライブパケットを使用するよう TCP/IP プロバイダーに要求できます。Windows Sockets プロバイダーはキープアライブの使用をサポートする必要はありません。サポートする場合、正確なセマンティクスは実装固有ですが、RFC 1122 のセクション 4.2.3.6 Requirements for Internet Hosts—Communication Layers に準拠する必要があります (このリソースは英語のみで提供される場合があります)。キープアライブの結果として接続が切断された場合、そのソケットで進行中のすべての呼び出しにはエラーコード WSAENETRESET が返され、以降の呼び出しは WSAENOTCONN で失敗します。
-
SO_LINGER は、ソケットに未送信のデータがキューイングされている状態で LPWSPCloseSocket が実行されたときの動作を制御します。SO_LINGER の設定が LPWSPCloseSocket のセマンティクスにどのように影響するかについては、LPWSPCloseSocket の説明を参照してください。Windows Sockets SPI クライアントは、optval パラメーターが指す LINGER 構造体を次の要素で作成し、目的の動作を設定します。
struct linger { u_short l_onoff; u_short l_linger; }SO_LINGER を有効にするには、Windows Sockets SPI クライアントは l_onoff に 0 以外の値を設定し、l_linger に 0 または目的のタイムアウト値 (秒単位) を設定して、LPWSPSetSockOpt を呼び出します。SO_DONTLINGER を有効にする (つまり SO_LINGER を無効にする) には、l_onoff を 0 に設定して LPWSPSetSockOpt を呼び出します。非ブロッキングソケットで 0 以外のタイムアウト値を指定して SO_LINGER を有効にすることは推奨されない点に注意してください。詳細については、LPWSPCloseSocket を参照してください。
SO_LINGER を有効にすると SO_DONTLINGER は無効になり、その逆も同様です。SO_DONTLINGER が無効な場合 (つまり SO_LINGER が有効な場合)、タイムアウト値は指定されない点に注意してください。この場合に使用されるタイムアウトは実装依存です。以前にそのソケットに対して (SO_LINGER を有効にすることで) タイムアウトが設定されていた場合、サービスプロバイダーはそのタイムアウト値を再設定する必要があります。
-
既定では、ソケットを既に使用されているローカルアドレスにバインドする (詳細については LPWSPBind を参照) ことはできません。しかし、このような形でアドレスを再利用することが望ましい場合もあります。各接続はローカルアドレスとリモートアドレスの組み合わせによって一意に識別されるため、リモートアドレスが異なる限り、2 つのソケットが同じローカルアドレスにバインドされていても問題はありません。別のソケットが既に使用しているローカルアドレスへのバインドをソケットの LPWSPBind で許可することを Windows Sockets プロバイダーに通知するには、Windows Sockets SPI クライアントは LPWSPBind を発行する前に、そのソケットに SO_REUSEADDR ソケットオプションを設定します。このオプションは LPWSPBind の時点でのみ解釈される点に注意してください。したがって、既存のアドレスにバインドしないソケットにこのオプションを設定することは不要ですが無害であり、LPWSPBind の後にこのオプションを設定またはリセットしても、そのソケットにも他のソケットにも影響しません。
-
Windows Sockets の実装が SO_RCVBUF および SO_SNDBUF オプションをサポートしている場合、Windows Sockets SPI クライアントは異なるバッファーサイズ (より大きいサイズまたはより小さいサイズ) を要求できます。サービスプロバイダーが要求された量をすべて提供しなかった場合でも、この呼び出しは成功することがあります。Windows Sockets SPI クライアントは、実際に提供されたバッファーサイズを確認するために、同じオプションを指定して LPWSPGetSockopt を呼び出す必要があります。
-
このオブジェクトは、ソケット s に関連付けられたサービスプロバイダーの構成情報を格納します。このデータ構造の正確な形式は、サービスプロバイダー固有です。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)