closesocket 関数 (winsock.h)

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

構文

int closesocket(
  [in] SOCKET s
);

パラメーター

[in] s

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

戻り値

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

エラー コード 意味
WSANOTINITIALIZED
この関数を使用する前に 、WSAStartup 呼び出しが正常に行われる必要があります。
WSAENETDOWN
ネットワーク サブシステムが失敗しました。
WSAENOTSOCK
記述子はソケットではありません。
WSAEINPROGRESS
ブロックしている Windows ソケット 1.1 呼び出しが進行中であるか、サービス プロバイダーがコールバック関数を処理しています。
WSAEINTR
(ブロッキング) Windows ソケット 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で失敗します。

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

ソケット への呼び出しが成功するたびに、アプリケーションは常に 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 メンバーを 0 に設定するだけで済みます。

アプリケーションが 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 メンバーで指定されたタイムアウト値内ですべてのデータを送信できなかった場合はハード。

Yes
 

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

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

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

残留構造体のl_onoff メンバーを 0 以外に設定し、非ブロッキング ソケットでタイムアウト間隔が 0 以外のl_linger メンバーを設定することはお勧めしません。 この場合、close 操作をすぐに完了できない場合、 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 の動作の概要を次に示します。

  • LENGTH 構造体のl_onoff メンバーがゼロ (ソケットの既定値) の場合、closesocket は直ちにを返し、接続はバックグラウンドで正常に閉じられます。
  • 残留構造のl_onoff メンバーが 0 以外に設定され、l_linger メンバーがゼロ (タイムアウトなし) に設定されている場合、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 を使用する場合の接続の破棄に関連する重要な問題を次に示します。

  • SD_SENDまたはSD_BOTHで closesocket または シャットダウン 機能を使用すると、制御チャネルで 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
ヘッダー winsock.h (Winsock2.h を含む)
Library Ws2_32.lib
[DLL] Ws2_32.dll

こちらもご覧ください

正常なシャットダウン、残留オプション、ソケットクロージャ

WSAAsyncSelect

WSADuplicateSocket

WSAOVERLAPPED

Winsock 関数

Winsock リファレンス

accept

getsockopt

ioctlsocket

残る

setsockopt

socket