LPFN_DISCONNECTEX コールバック関数 (mswsock.h)

DisconnectEx 関数は、ソケット上の接続を閉じ、ソケット ハンドルを再利用できるようにします。

注意

この関数は、Windows ソケット仕様に対する Microsoft 固有の拡張機能です。

構文

LPFN_DISCONNECTEX LpfnDisconnectex;

BOOL LpfnDisconnectex(
  SOCKET s,
  LPOVERLAPPED lpOverlapped,
  DWORD dwFlags,
  DWORD dwReserved
)
{...}

パラメーター

s

接続された接続指向ソケットへのハンドル。

lpOverlapped

OVERLAPPED 構造体へのポインター。 ソケット ハンドルが重複して開かれている場合、このパラメーターを指定すると、重複した (非同期の) I/O 操作が発生します。

dwFlags

関数呼び出しの処理をカスタマイズするフラグのセット。 このパラメーターを 0 に設定すると、フラグは設定されません。 dwFlags パラメーターには、次の値を指定できます。

フラグ 説明
TF_REUSE_SOCKET 再利用するソケット ハンドルを準備します。 DisconnectEx 要求が完了すると、ソケット ハンドルを AcceptEx または ConnectEx 関数に渡すことができます。
メモ: ソケット レベルの切断は、基になるトランスポートの動作の影響を受ける。 たとえば、TCP ソケットが TCP TIME_WAIT状態の影響を受け、 DisconnectEx 呼び出しが遅延する可能性があります。

dwReserved

予約済み。 ゼロを指定してください。 0 以外の場合は、 WSAEINVAL が返されます。

戻り値

成功すると、 DisconnectEx 関数は TRUE を返します。 失敗した場合、関数は FALSE を返しますWSAGetLastError 関数を使用して、拡張エラー情報を取得します。 WSAGetLastError 関数の呼び出しがERROR_IO_PENDINGを返した場合、操作は正常に開始され、進行中です。 このような状況では、操作が完了しても呼び出しが失敗する可能性があります。

エラー コード 説明
WSAEFAULT ポインター引数を使用しようとしたときに、システムによって無効なポインター アドレスが検出されました。 lpOverlapped パラメーターに無効なポインター値が渡された場合、このエラーが返されます。
WSAEINVAL 無効なパラメーターが渡されました。 このエラーは、 dwFlags パラメーターが TF_REUSE_SOCKET 以外の 0 の値で指定された場合に返されます。
WSAENOTCONN ソケットは接続されていません。 ソケット パラメーターが接続状態でない場合、このエラーが返されます。 このエラーは、ソケットが前の要求から送信終了状態にあり、 dwFlags パラメーターがソケットの再利用を要求するために TF_REUSE_SOCKET に設定されていない場合にも返すことができます。

注釈

DisconnectEx 関数は、データグラム ソケットをサポートしていません。 したがって、 hSocket によって指定されるソケットは、SOCK_STREAM、SOCK_SEQPACKET、SOCK_RDM ソケットなど、接続指向である必要があります。

注意

DisconnectEx 関数の関数ポインターは、実行時に、指定されたSIO_GET_EXTENSION_FUNCTION_POINTERオペコードを使用して WSAIoctl 関数を呼び出すことによって取得する必要があります。 WSAIoctl 関数に渡される入力バッファーには、DisconnectEx 拡張関数を識別する値を持つグローバル一意識別子 (GUID) WSAID_DISCONNECTEXが含まれている必要があります。 成功すると、 WSAIoctl 関数によって返される出力には DisconnectEx 関数へのポインターが含まれます。 WSAID_DISCONNECTEX GUID は、Mswsock.h ヘッダー ファイルで定義されています。

lpOverlappedNULL でない場合、DisconnectEx が返される前に重複した I/O が終了せず、DisconnectEx 関数が FALSE を返し、WSAGetLastError 関数の呼び出しがERROR_IO_PENDINGを返す可能性があります。 この設計により、呼び出し元は切断操作の完了中に処理を続行できます。 要求が完了すると、Windows は OVERLAPPED 構造体の hEvent メンバーによって指定されたイベント、または hSocket で指定されたソケットをシグナル状態に設定します。

注意

特定のスレッドによって開始されたすべての I/O は、そのスレッドが終了すると取り消されます。 重複するソケットの場合、保留中の非同期操作は、操作が完了する前にスレッドが閉じられた場合に失敗する可能性があります。 詳細については、「 ExitThread 」を参照してください。

TIME_WAIT状態は、TCP が閉じた接続を解放してそのリソースを再利用できるようになるまでに経過する必要がある時間を決定します。 クロージャとリリースの間のこの間隔は、TIME_WAIT状態または 2MSL 状態と呼ばれます。 この間、新しい接続を確立するよりも、クライアントとサーバーへのコストを大幅に削減して、接続を再度開くことができます。 TIME_WAIT動作は RFC 793 で指定されており、TCP はネットワークの最大セグメント有効期間 (MSL) の少なくとも 2 倍の間隔で閉じた接続を維持する必要があります。 接続が解放されると、ソケットペアとソケットに使用される内部リソースを使用して、別の接続をサポートできます。

Windows TCP は、接続の終了後にTIME_WAIT状態に戻ります。 TIME_WAIT状態では、ソケット ペアを再利用できません。 TIME_WAIT期間は、TIME_WAIT期間を秒単位で表す次の DWORD レジストリ設定を変更することで構成できます。

Hkey_local_machine\システム\CurrentControlSet\サービス\Tcpip\パラメーター\TcpTimedWaitDelay

既定では、MSL は 120 秒に定義されています。 TcpTimedWaitDelay レジストリ設定の既定値は 240 秒で、セグメントの最大有効期間の 120 秒または 4 分の 2 倍を表します。 ただし、このエントリを使用して間隔をカスタマイズできます。 このエントリの値を小さくすると、TCP は閉じた接続をより迅速に解放し、新しい接続に対してより多くのリソースを提供できます。 ただし、値が小さすぎると、TCP は接続が完了する前に接続リソースを解放する可能性があり、サーバーは接続を再確立するために追加のリソースを使用する必要があります。 このレジストリ設定は、0 から 300 秒に設定できます。

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

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

要件

要件
Header mswsock.h