LPWSPCLEANUP
コールバックシグネチャ
INT LPWSPCLEANUP(
INT* lpErrno
);パラメーター
| フィールド | 型 | 説明 |
|---|---|---|
| lpErrno | INT* | エラーコードへのポインター。 |
公式ドキュメント
LPWSPCleanup 関数は、Windows Sockets サービスプロバイダーの使用を終了します。
戻り値
操作が正常に開始された場合、戻り値は 0 です。それ以外の場合は SOCKET_ERROR が返され、固有のエラー番号を lpErrno で取得できます。
| エラーコード | 意味 |
|---|---|
| この関数を使用する前に、**WSPStartup** の呼び出しが成功している必要があります。 | |
| ネットワークサブシステムで障害が発生しました。 | |
| ネームスペースプロバイダーに指定されたプロバイダー識別子が、そのネームスペースプロバイダーの管理対象ではありません。 |
解説(Remarks)
Windows Sockets 2 SPI クライアントは、Winsock サービスプロバイダーを使用する前に WSPStartup の呼び出しを成功させておく必要があります。Winsock サービスプロバイダーの使用を終えると、SPI クライアントは LPWSPCleanup を呼び出して Winsock サービスプロバイダーから自身の登録を解除し、Windows Sockets 2 クライアントのために割り当てられたリソースをサービスプロバイダーが解放できるようにします。SPI クライアントが WSPStartup を複数回呼び出すことは許容されます。WSPStartup の呼び出しごとに、対応する LPWSPCleanup の呼び出しも発行されます。実際のクリーンアップを行うのは、そのサービスプロバイダーに対する最後の LPWSPCleanup だけであり、それ以前の呼び出しは Winsock サービスプロバイダー内部の参照カウントを減らすだけです。
内部の参照カウントが 0 に達して実際のクリーンアップ処理が開始されると、このプロセス内のいずれかのスレッドが発行した保留中のブロッキング呼び出しや非同期呼び出しは、通知メッセージを送出することも、イベントオブジェクトをシグナル状態にすることもなくキャンセルされます。このプロセス内のいずれかのスレッドが発行した保留中のオーバーラップ送受信操作(オーバーラップソケットに対する LPWSPSend、LPWSPSendTo、LPWSPRecv、LPWSPRecvFrom)も、イベントオブジェクトを設定することなく、また指定されていても完了ルーチンを呼び出すことなくキャンセルされます。この場合、保留中のオーバーラップ操作はエラー状態 WSA_OPERATION_ABORTED で失敗します。LPWSPCleanup が呼び出された時点で開いているソケットは、LPWSPCloseSocket が呼び出された場合と同様にリセットされ、自動的に解放されます。LPWSPCloseSocket によって既に閉じられているものの、送信すべきデータが残っているソケットは影響を受けず、保留中のデータはそのまま送信されます。
この関数は、サービスプロバイダー DLL がメモリからアンロードされる準備が整うまで、戻るべきではありません。特に、送信されずに残っているデータは、既に送信が完了しているか、サービスプロバイダーの DLL と共にメモリからアンロードされることのないトランスポートスタックの部分によって送信用にキューイングされている必要があります。
Winsock サービスプロバイダーは、(エラーなどが原因で) LPWSPCleanup を呼び出さずにプロセスが終了する場合にも対処できるようにしておく必要があります。また Winsock サービスプロバイダーは、LPWSPCleanup の実行後に、Ws2_32.dll が直ちに WSPStartup を呼び出して Winsock の利用を再確立できる状態が保たれるようにしなければなりません。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)