closesocket 関数 (winsock2.h)

closesocket 関数は、既存のソケットを閉じます。

構文

int WSAAPI closesocket(
  [in] SOCKET s
);

パラメーター

[in] s

閉じるソケットを識別する記述子。

戻り値

エラーが発生しない場合、 closesocket は 0 を返します。 それ以外の場合は、 SOCKET_ERROR の値が返され、 WSAGetLastError を呼び出すことによって特定のエラー コードを取得できます。

エラー コード 意味
WSANOTINITIALIZED
この関数を使用する前に、 WSAStartup 呼び出しが正常に行われる必要があります。
WSAENETDOWN
ネットワーク サブシステムが失敗しました。
WSAENOTSOCK
記述子はソケットではありません。
WSAEINPROGRESS
ブロックしている Windows Sockets 1.1 呼び出しが進行中であるか、サービス プロバイダーがコールバック関数を処理しています。
WSAEINTR
(ブロッキング) Windows Socket 1.1 呼び出しは 、WSACancelBlockingCall を介して取り消されました。
WSAEWOULDBLOCK
ソケットは非ブロッキングとしてマークされていますが、残留構造のl_onoff メンバーは 0 以外に設定され、残留構造のl_linger メンバーは 0 以外のタイムアウト値に設定されます。

解説

closesocket 関数はソケットを閉じます。 これを使用して 、 パラメーターで 渡されたソケット記述子を解放します。 s パラメーターで渡されたソケット記述子は、closesocket 関数が発行されるとすぐにシステムによって再利用される可能性があることに注意してください。 その結果、 s パラメーターで渡されたソケット記述子への参照が、エラー WSAENOTSOCK で失敗することは期待できません。 Winsock クライアントでは、別の Winsock 関数呼び出しと同時にclosesocket を発行しないでください。

このプロセスのスレッドによって発行された保留中の重複する送受信操作 ( WSASend/ WSASendTo/ WSARecv/ WSARecvFrom と重複するソケット) も取り消されます。 これらの重複する操作に対して指定されたイベント、完了ルーチン、または完了ポート アクションが実行されます。 保留中の重複した操作は、エラー状態 WSA_OPERATION_ABORTEDで失敗します。

アプリケーションでは、 closesocket が戻ったときに、ソケットに対する未処理の I/O 操作がすべて完了すると想定しないでください。 closesocket 関数は、未処理の I/O 操作で取り消しを開始しますが、これは、closesocket 関数が戻るまでにアプリケーションがこれらの I/O 操作の I/O 完了を受け取るという意味ではありません。 したがって、アプリケーションは、I/O 要求が実際に完了するまで、未処理の I/O 要求によって参照されるリソース (WSAOVERLAPPED 構造体など) をクリーンアップしないでください。

ソケットへの呼び出しが成功するたびに、アプリケーションは常に closesocketへの一 致する呼び出しを行って、ソケット リソースをシステムに返す必要があります。

残留構造では、データの送信がキューに登録され、ソケットで closesocket 関数が呼び出されたときにソケットがどのように動作するかを指定する、特定のソケットに関する情報が保持されます。

残留構造のl_onoff メンバーは、キューに登録されたデータの送信を有効にするために closesocket 関数呼び出しの後、指定した時間ソケットを開いたままにするかどうかを決定します。 このメンバーは、次の 2 つの方法で変更できます。

  • optname パラメーターを SO_DONTLINGER に設定して setsockopt 関数を呼び出します。 optval パラメーターは、l_onoff メンバーの変更方法を決定します。
  • optname パラメーターを SO_LINGER に設定して setsockopt 関数を呼び出します。 optval パラメーターは、l_onoffメンバーとl_linger メンバーの両方を変更する方法を指定します。

残留構造のl_linger メンバーは、ソケットを開いたままにする必要がある時間 (秒単位) を決定します。 このメンバーは、残留構造のl_onoff メンバーが 0 以外の場合にのみ適用されます。

ソケットの既定のパラメーターは、残留構造のl_onoff メンバーが 0 であり、ソケットを開いたままにしないことを示します。 残留構造のl_linger メンバーの既定値は 0 ですが、l_onoff メンバーが 0 に設定されている場合、この値は無視されます。

ソケットを開いたままにするには、アプリケーションで l_onoff メンバーを 0 以外の値に設定し、 l_linger メンバーを目的のタイムアウト (秒単位) に設定する必要があります。 開いたままのソケットを無効にするには、アプリケーションで、残留構造のl_onoff メンバーをゼロに設定するだけで済みます。

アプリケーションが optname パラメーターを SO_DONTLINGER に設定して setsockopt 関数を呼び出して、l_onoff メンバーを 0 以外の値に設定した場合、l_linger メンバーの値は指定されません。 この場合、使用されるタイムアウトは実装に依存します。 ソケットに対して以前のタイムアウトが確立されている場合 (以前に optname パラメーターを SO_LINGER に設定して setsockopt 関数を呼び出すことによって)、このタイムアウト値はサービス プロバイダーによって復帰する必要があります。

closesocket 関数のセマンティクスは、残留構造のメンバーを設定するソケット オプションの影響を受けます。

l_onoff l_linger 閉じるの種類 閉じるのを待ちますか?
ゼロ 気にしない 正常な閉じる いいえ
0 以外 ゼロ 硬調 いいえ
0 以外 0 以外 すべてのデータが 、l_linger メンバーで指定されたタイムアウト値内で送信される場合は正常です。

l_linger メンバーで指定されたタイムアウト値内ですべてのデータを送信できなかった場合はハード。

はい
 

ストリーム ソケットの L_ONOFF メンバーが ストリーム ソケットで 0 の場合、 closesocket 呼び出しは直ちにを返し、ソケットがブロックしているか非ブロックであるかに関係なく 、WSAEWOULDBLOCK を受信しません。 ただし、可能であれば、基になるソケットが閉じられる前に、送信のためにキューに入れられているすべてのデータが送信されます。 これは、正常な切断または閉じるとも呼ばれます。 この場合、Windows Sockets プロバイダーはソケットとその他のリソースを任意の期間解放できないため、使用可能なすべてのソケットを使用するアプリケーションに影響を与えます。 これはソケットの既定の動作です。

残留構造のl_onoff メンバーが 0 以外で、l_linger メンバーが 0 の場合、キューに登録されたデータがまだ送信または確認されていない場合でも、closesocket はブロックされません。 ソケットの仮想回線が直ちにリセットされ、存在しないデータが失われるため、これはハードクローズまたは中止クローズと呼ばれます。 Windows では、回線のリモート側での recv 呼び出しは WSAECONNRESET で失敗します。

残留構造のl_onoff メンバーが 0 以外に設定され、l_linger メンバーがブロッキング ソケットで 0 以外のタイムアウトに設定されている場合、closesocket 呼び出しは、残りのデータが送信されるまで、またはタイムアウトが切れるまでブロックします。 これは、すべてのデータが l_linger メンバーで指定されたタイムアウト値内で送信される場合は、正常な切断またはクローズと呼ばれます。 すべてのデータが送信される前にタイムアウトが切れた場合、Windows Sockets 実装は closesocket が返される前に接続を終了し、これはハードクローズまたは中止クローズと呼ばれます。

残留構造のl_onoff メンバーを 0 以外に設定し、非ブロッキング ソケットでタイムアウト間隔が 0 以外のl_linger メンバーを設定することはお勧めしません。 この場合、閉じる操作をすぐに完了できない場合、 closesocket の呼び出しは WSAEWOULDBLOCK のエラーで失敗します。 WSAEWOULDBLOCKclosesocket が失敗した場合、ソケット ハンドルは引き続き有効であり、切断は開始されません。 ソケットを閉じるには、アプリケーションで closesocket を再度呼び出す必要があります。

残留構造のl_onoff メンバーが 0 以外で、l_linger メンバーがブロッキング ソケットで 0 以外のタイムアウト間隔である場合、closesocket 関数の結果を使用して、すべてのデータがピアに送信されたかどうかを判断することはできません。 l_linger メンバーで指定されたタイムアウトの前にデータが送信された場合、または接続が中止された場合、closesocket 関数はエラー コードを返しません (closesocket 関数からの戻り値は 0 です)。

closesocket 呼び出しは、すべてのデータがピアに配信されるか、タイムアウトが切れるまでブロックされます。 タイムアウトが切れたために接続がリセットされた場合、ソケットはTIME_WAIT状態になりません。 すべてのデータがタイムアウト期間内に送信された場合、ソケットはTIME_WAIT状態になります。

残留構造のl_onoff メンバーが 0 以外で、l_linger メンバーがブロッキング ソケットのタイムアウト間隔が 0 の場合、closesocket の呼び出しによって接続がリセットされます。 ソケットはTIME_WAIT状態になりません。

ソケットに関連付けられている残留構造の現在の値を取得するには、optname パラメーターを SO_LINGER に設定して、getsockopt 関数を呼び出すことができます。

メモ接続ですべてのデータが確実に送受信されるように、アプリケーションは closesocket を呼び出す前にシャットダウンを呼び出す必要があります (詳細については、「グレースフル シャットダウン、残留オプション、ソケットクロージャ」を参照してください)。 また、 closesocket が呼び出された後は、FD_CLOSE ネットワーク イベントは投稿されないことに注意してください。
 

closesocket の動作の概要を次に示します。

  • LINGER 構造体のl_onoff メンバーが 0 (ソケットの既定値) の場合、closesocket は直ちにを返し、接続はバックグラウンドで正常に閉じられます。
  • 残留構造のl_onoff メンバーが 0 以外に設定され、l_linger メンバーが 0 (タイムアウトなし) に設定されている場合、closesocket は直ちにを返し、接続がリセットまたは終了します。
  • 残留構造のl_onoff メンバーが 0 以外に設定され、l_linger メンバーが 0 以外のタイムアウトに設定されている場合:– ブロッキング ソケットの場合は、すべてのデータが送信されるかタイムアウトが切れるまで、closesocket ブロックを閉じます。

    – 非ブロッキング ソケットの場合、 closesocket はエラーを示す直ちにを返します。

詳細については、「 グレースフル シャットダウン」、「残留オプション」、「ソケット クロージャ 」を参照してください。

メモclosesocket などのブロッキング Winsock 呼び出しを発行する場合、Winsock は、呼び出しを完了する前にネットワーク イベントを待機する必要がある場合があります。 Winsock は、この状況でアラート可能な待機を実行します。この待機は、同じスレッドでスケジュールされた非同期プロシージャ 呼び出し (APC) によって中断される可能性があります。 同じスレッドで進行中の Winsock 呼び出しを中断した APC 内で別のブロック Winsock 呼び出しを発行すると、未定義の動作が発生し、Winsock クライアントが試行してはなりません。
 

IrDA ソケットに関する注意事項

次の点に注意してください。

  • Af_irda.h ヘッダー ファイルは明示的に含まれている必要があります。
  • 標準の残留オプションがサポートされています。
  • IrDA は正常なクローズを提供しませんが、IrDA は受信キューが消去されるまでクローズを延期します。 したがって、アプリケーションはデータを送信し、すぐに ソケット 関数を呼び出し、受信側がFD_CLOSEメッセージを受信する前にデータをコピーすることを確信できます。

ATM に関する注意事項

非同期転送モード (ATM) と Windows ソケット 2 を使用する場合の接続の破棄に関連する重要な問題を次に示します。

  • closesocket またはシャットダウン機能をSD_SENDまたはSD_BOTHと共に使用すると、制御チャネルで RELEASE 信号が送信されます。 ATM が個別の信号チャネルとデータ チャネルを使用しているため、データの最後が宛先に到達する前に RELEASE 信号がリモートエンドに到達し、そのデータが失われる可能性があります。 考えられる解決策の 1 つは、最後に送信されたデータと ATM ソケットの closesocket または シャットダウン 関数呼び出しの間に十分な遅延をプログラミングすることです。
  • ハーフクローズはATMではサポートされていません。
  • 中止と正常な切断の両方で、同じ原因フィールドで RELEASE シグナルが送信されます。 どちらの場合も、ソケットのリモート側で受信したデータは引き続きアプリケーションに配信されます。 詳細については、「 グレースフル シャットダウン」、「残留オプション」、「ソケット クロージャ 」を参照してください。

Windows Phone 8: この関数は、Windows Phone 8 以降の Windows Phone ストア アプリでサポートされています。

Windows 8.1Windows Server 2012 R2: この関数は、Windows 8.1、Windows Server 2012 R2 以降の Windows ストア アプリでサポートされています。

要件

   
サポートされている最小のクライアント Windows 8.1、Windows Vista [デスクトップ アプリ |UWP アプリ]
サポートされている最小のサーバー Windows Server 2003 [デスクトップ アプリのみ | UWP アプリ]
対象プラットフォーム Windows
ヘッダー winsock2.h (Winsock2.h を含む)
Library Ws2_32.lib
[DLL] Ws2_32.dll

関連項目

グレースフル シャットダウン、残留オプション、ソケット クロージャ

WSAAsyncSelect

WSADuplicateSocket

WSAOVERLAPPED

Winsock 関数

Winsock リファレンス

accept

getsockopt

ioctlsocket

残る

setsockopt

socket