LPFN_DISCONNECTEX
コールバックシグネチャ
BOOL LPFN_DISCONNECTEX(
SOCKET s,
OVERLAPPED* lpOverlapped,
DWORD dwFlags,
DWORD dwReserved
);パラメーター
| フィールド | 型 | 説明 | ||||
|---|---|---|---|---|---|---|
| s | SOCKET | 接続済みのコネクション指向ソケットのハンドル。 | ||||
| lpOverlapped | OVERLAPPED* | OVERLAPPED 構造体へのポインター。ソケットハンドルがオーバーラップ指定で開かれている場合、このパラメーターを指定すると、オーバーラップ (非同期) I/O 操作になります。 | ||||
| dwFlags | DWORD | 関数呼び出しの処理方法をカスタマイズするフラグのセット。このパラメーターにゼロを設定した場合、フラグは設定されません。dwFlags パラメーターには次の値を指定できます。
| ||||
| dwReserved | DWORD | 予約済み。ゼロにする必要があります。ゼロ以外の場合は、WSAEINVAL が返されます。 |
公式ドキュメント
DisconnectEx 関数は、ソケット上の接続を閉じ、ソケットハンドルを再利用できるようにします。
この関数は、Windows Sockets 仕様に対する Microsoft 固有の拡張です。
戻り値
成功した場合、DisconnectEx 関数は TRUE を返します。失敗した場合、この関数は FALSE を返します。拡張エラー情報を取得するには、WSAGetLastError 関数を使用します。WSAGetLastError 関数の呼び出しが ERROR_IO_PENDING を返した場合、操作は正常に開始され、進行中です。この場合でも、操作の完了時に失敗することがあります。
| エラーコード | 説明 |
|---|---|
| WSAEFAULT | ポインター引数を使用しようとした際に、システムが無効なポインターアドレスを検出しました。このエラーは、lpOverlapped パラメーターに無効なポインター値が渡された場合に返されます。 |
| WSAEINVAL | 無効なパラメーターが渡されました。このエラーは、dwFlags パラメーターに TF_REUSE_SOCKET 以外のゼロでない値が指定された場合に返されます。 |
| WSAENOTCONN | ソケットが接続されていません。このエラーは、ソケットの s パラメーターが接続状態になかった場合に返されます。また、以前の要求によってソケットが送信クローズ状態にあり、ソケットの再利用を要求するために dwFlags パラメーターに TF_REUSE_SOCKET が設定されていなかった場合にも返されることがあります。 |
解説(Remarks)
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 ヘッダーファイルで定義されています。
lpOverlapped が NULL でない場合、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 の期間は、その期間を秒単位で表す次の DWORD レジストリ設定を変更することで構成できます。
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\TCPIP\Parameters\TcpTimedWaitDelay
既定では、MSL は 120 秒と定義されています。TcpTimedWaitDelay レジストリ設定の既定値は 240 秒で、これは最大セグメント有効期間 120 秒の 2 倍、つまり 4 分に相当します。ただし、このエントリを使用して間隔をカスタマイズできます。この値を小さくすると、TCP は閉じた接続をより早く解放できるようになり、新しい接続により多くのリソースを提供できます。ただし、値が小さすぎると、接続が完了する前に TCP が接続リソースを解放してしまい、サーバーが接続を再確立するために追加のリソースを使用する必要が生じる場合があります。このレジストリ設定には 0 ~ 300 秒の値を設定できます。
Windows Phone 8: この関数は、Windows Phone 8 以降の Windows Phone ストアアプリでサポートされています。
Windows 8.1 および Windows Server 2012 R2: この関数は、Windows 8.1、Windows Server 2012 R2 以降の Windows ストアアプリでサポートされています。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)