WSACleanup

WSACleanup関数はWinsock 2 DLLの使用を終了します。

SOCKET WSACleanup();

WS2_32.DLL

引数

引数はありません。

戻り値

成功すると0を返します。

失敗すると-1 (SOCKET_ERROR) を返します。特定のエラーコードを取得するにはWSAGetLastError関数を呼び出します。

10036 (WSAEINPROGRESS)

ブロッキングWindows Sockets 1.1呼び出しが実行中であるか、サービスプロバイダがコールバック関数を実行中です。

10050 (WSAENETDOWN)

ネットワークサブシステムが失敗しました。

10093 (WSANOTINITIALISED)

この関数を呼び出す前にWSAStartup関数の呼び出しが成功していなければなりません。

解説

アプリケーションまたはDLLは、Windows Socketsサービスを使用する前にWSAStartup呼び出しを成功させることが要求されます。アプリケーションまたはDLLは、Windows Socketsの使用を完了した時にWSACleanup関数を呼び出して、Windows Sockets実装から自身を登録解除し、実装がアプリケーションまたはDLLのために確保したすべてのリソースを解放できるようにしなければなりません。

WSACleanup関数が呼び出されると、ポストされている通知メッセージやシグナル状態のイベントオブジェクトを除き、プロセスのすべてのスレッドによって発行されたあらゆる保留中のブロッキングや非同期Widnows Sockets呼び出しがキャンセルされます。オーバーラップ送受信操作(例えばオーバーラップソケットを用いたWSASend, WSASendTo, WSARecv, WSARecvFrom)が指定されている場合は、イベントオブジェクトを設定中であるか、完了ポートルーチンを呼び出し中である場合を除き、プロセスのすべてのスレッドによって発行されたあらゆる保留中オーバーラップ送受信操作がキャンセルされます。この場合、オーバーラップ操作はエラーステータスWSA_OPERATION_ABORTEDで失敗します。

WSACleanup関数が呼び出された時点でオープンされていたソケットはリセットされ、closesocketを呼び出した場合と同じように自動的に解放されます。WSACleanup関数の呼び出し時に、closesocketでクローズされたけれども保留中の送信データがまだ存在するソケットは影響を受ける可能性があります。この場合、アプリケーション終了時にWS2_32.DLLがメモリからアンロードされると保留中データが失われる可能性があります。すべての保留中データが確実に送信されるようにするには、アプリケーションはshutdownを使用してコネクションをクローズし、クローズ完了まで待機してからclosesocketおよびWSACleanupを呼び出します。キューイングされポストされていないメッセージや、ポストされたメッセージなどを含む、すべてのリソースおよび内部状態は、次のユーザーに利用可能となるように解放されなければなりません。

WSAStartup関数のそれぞれの呼び出し成功に対してWSACleanup関数を呼び出さなければなりません。最後のWSACleanup関数呼び出しのみが実際のクリーンアップを行います。それ以外の呼び出しは単にWS2_32.DLLが持つ内部参照カウントをデクリメントします。

Note: WSACleanup関数はWindows Sockets名前空間プロバイダに登録された名前(例えばPeer Name Resolution Protocol(PNRP)名前空間プロバイダに登録されたピア名)を登録解除しません。

Windows Sockets 1.1では、ブロッキングフックの内部からWSACleanup呼び出しを試みておきながら、そのリターンコードをチェックしないという、よくあるプログラミング上の間違いがありました。ブロッキング呼び出しが未処理の状態の時にWinsock 1.1アプリケーションが終了する必要がある場合、アプリケーションはまずWSACancelBlockingCallを呼び出してブロッキング呼び出しをキャンセルし、その後で制御がアプリケーションに戻ったらWSACleanupを呼び出さなければなりません。Windows Sockets 2ではこの問題は存在せず、WSACancelBlockingCall関数は削除されています。

一般に、WSACleanup関数ではプロトコル固有のヘルパーDLLをアンロードすることになります。したがって、そのため、アプリケーションDLLではDllMain関数からWSACleanup関数を呼び出すべきではありません。DllMain関数からのWSACleanup関数呼び出しは潜在的にデッドロックを引き起こす可能性があります。