LPWSPGETOVERLAPPEDRESULT コールバック関数 (ws2spi.h)
LPWSPGetOverlappedResult 関数は、指定されたソケットで重複した操作の結果を返します。
構文
LPWSPGETOVERLAPPEDRESULT Lpwspgetoverlappedresult;
BOOL Lpwspgetoverlappedresult(
[in] SOCKET s,
[in] LPWSAOVERLAPPED lpOverlapped,
[out] LPDWORD lpcbTransfer,
[in] BOOL fWait,
[out] LPDWORD lpdwFlags,
[out] LPINT lpErrno
)
{...}
パラメーター
[in] s
ソケットを識別します。 これは、重複した操作が LPWSPRecv、LPWSPRecvFrom、LPWSPSend、LPWSPSendTo、または LPWSPIoctl の呼び出しによって開始されたときに指定されたソケットと同じです。
[in] lpOverlapped
重なり合った操作の開始時に指定された WSAOverlapped 構造体へのポインター。
[out] lpcbTransfer
送受信操作または LPWSPIoctl によって実際に転送されたバイト数を受け取る 32 ビット変数へのポインター。
[in] fWait
保留中の重複する操作が完了するまで関数を待機するかどうかを指定します。 TRUE の場合、関数は操作が完了するまで戻りません。 FALSE を指定しても操作が保留中の場合、関数は FALSE を返し、lpErrno はWSA_IO_INCOMPLETE。 fWait パラメーターは、重複する操作がイベント ベースの完了通知を選択した場合にのみ TRUE に設定できます。
[out] lpdwFlags
完了状態を補足する 1 つ以上のフラグを受け取る 32 ビット変数へのポインター。 重複した操作が LPWSPRecv または LPWSPRecvFrom によって開始された場合、このパラメーターには lpFlags パラメーターの結果値が含まれます。
[out] lpErrno
エラー コードへのポインター。
戻り値
LPWSPGetOverlappedResult が成功した場合、戻り値は TRUE になります。 これは、重複した操作が正常に完了し、 lpcbTransfer が指す値が更新されたことを意味します。 LPWSPGetOverlappedResult が FALSE を返した場合、これは、重複した操作が完了していないか、重複した操作が完了していないがエラーが発生したか、LPWSPGetOverlappedResult に対する 1 つ以上のパラメーターのエラーが原因で完了状態を特定できなかったことを意味します。 失敗した場合、 lpcbTransfer が指す値は更新されません。 lpErrno パラメーターは、エラーの原因 (LPWSPGetOverlappedResult または関連する重複した操作のいずれか) を示します。
エラー コード | 意味 |
---|---|
ネットワーク サブシステムが失敗しました。 | |
記述子はソケットではありません。 | |
WSAOverlapped 構造体の **hEvent** メンバーには、有効なイベント オブジェクト ハンドルが含まれていません。 | |
パラメーターの 1 つは受け入れられません。 | |
fWait パラメーターは **FALSE** で、I/O 操作はまだ完了していません。 |
注釈
LPWSPGetOverlappedResult 関数によって報告される結果は、指定した WSAOverlapped 構造体が指定され、操作の結果が保留中であった、指定されたソケットの最後の重複した操作の結果です。 保留中の操作は、操作を開始した関数がSOCKET_ERRORを返し、 lpErrno がWSA_IO_PENDINGされたときに示されます。 I/O 操作が保留中の場合、操作を開始した関数は、WSAOVERLAPPED 構造体の hEvent メンバーを非署名状態にリセットします。 次に、保留中の操作が完了すると、システムはイベント オブジェクトをシグナル状態に設定します。
fWait パラメーターが TRUE の場合、LPWSPGetOverlappedResult は、イベント オブジェクトがシグナル状態になるのをブロックして待機することで、保留中の操作が完了したかどうかを判断します。 クライアントは、I/O 操作が要求されたときにイベント ベースの完了通知を選択した場合にのみ、 fWait パラメーターを TRUE に設定できます。 別の形式の通知が選択されている場合、WSAOverlapped 構造体の hEvent メンバーの使用が異なり、fWait を TRUE に設定すると、予期しない結果が発生します。
注意
特定のスレッドによって開始されたすべての I/O は、そのスレッドが終了すると取り消されます。 重複するソケットの場合、操作が完了する前にスレッドが閉じられた場合、保留中の非同期操作が失敗する可能性があります。 詳細については、「 ExitThread 」を参照してください。
WPUCompleteOverlappedRequest との対話
WPUCompleteOverlappedRequest の動作では、WSAOverlapped 構造体の Offset メンバーと OffsetHigh メンバーのみがサービス プロバイダーによって排他的に制御されるため、LPWSPGetOverlappedResult によって構造体から 3 つの値 (バイト数、フラグ、およびエラー) を取得する必要があるため、サービス プロバイダーが LPWSPGetOverlappedResult を実装する方法にいくつかの制約があります。 サービス プロバイダーは、 WPUCompleteOverlappedRequest の動作と適切に対話する限り、これを任意の方法で実行できます。 次の説明は、一般的な実装を示しています。
重複処理の開始時に、サービス プロバイダーは Internal を WSS_OPERATION_IN_PROGRESS に設定します。
I/O 操作が完了すると、プロバイダーは OffsetHigh を操作の結果として Windows Sockets 2 エラー コードに設定し、 Offset を I/O 操作の結果のフラグに設定し、 WPUCompleteOverlappedRequest を呼び出して転送バイト数をパラメーターの 1 つとして渡します。 WPUCompleteOverlappedRequest は最終的に InternalHigh を転送バイト数に設定し、 Internal をWSS_OPERATION_IN_PROGRESS以外の値に設定します。
LPWSPGetOverlappedResult が呼び出されると、サービス プロバイダーは Internal を確認します。 WSS_OPERATION_IN_PROGRESS場合、プロバイダーは hEvent メンバーのイベント ハンドルを待機するか、LPWSPGetOverlappedResult の fWait フラグの設定に基づいてエラーを返します。 進行中でない場合、または待機が完了した後、プロバイダーは、転送カウント、操作結果エラー コード、フラグとしてInternalHigh、OffsetHigh、Offset の値をそれぞれ返します。
要件
要件 | 値 |
---|---|
サポートされている最小のクライアント | Windows 2000 Professional [デスクトップ アプリのみ] |
サポートされている最小のサーバー | Windows 2000 Server [デスクトップ アプリのみ] |
Header | ws2spi.h |