LPWSPCANCELBLOCKINGCALL コールバック関数 (ws2spi.h)

LPWSPCancelBlockingCall 関数は、現在進行中のブロッキング呼び出しを取り消します。

構文

LPWSPCANCELBLOCKINGCALL Lpwspcancelblockingcall;

int Lpwspcancelblockingcall(
  [out] LPINT lpErrno
)
{...}

パラメーター

[out] lpErrno

エラー コードへのポインター。

戻り値

操作が正常に取り消された場合、 LPWSPCancelBlockingCall によって返される値は 0 です。 それ以外の場合は、SOCKET_ERROR値が返され、 lpErrno で特定のエラー コードを使用できます。

エラー コード 意味
WSAENETDOWN
ネットワーク サブシステムが失敗しました。
WSAEINVAL
未処理のブロック呼び出しがないことを示します。

注釈

この関数は、このスレッドの未処理のブロック操作を取り消します。 これは通常、次の 2 つの状況で使用されます。

  • Windows ソケット SPI クライアントは、サービス プロバイダーが擬似ブロッキングを実装している間に受信されたメッセージを処理しています。 この場合、 WSAIsBlocking は true になります。
  • ブロック呼び出しが進行中であり、Winsock サービス プロバイダーは Winsock SPI クライアントのブロッキング フック関数 ( WPUQueryBlockingCallback から取得したコールバック関数を介して) にコールバックしました。この関数が呼び出されます。 このような状況は、たとえば、完了するまでの時間が長い操作の Cancel オプションを実装する場合に発生する可能性があります。

いずれの場合も、元のブロッキング呼び出しは、エラー WSAEINTR でできるだけ早く終了します。 (最初のインスタンスでは、Windows メッセージ のスケジュールによって、Winsock の擬似ブロッキング ルーチンに制御が戻るまで終了は行われません。2 番目のインスタンスでは、ブロッキング フック関数が完了するとすぐにブロック呼び出しが終了します)。

LPWSPConnect 操作をブロックしている場合、Winsock はブロック呼び出しをできるだけ早く終了しますが、接続が完了 (リセットされた後) またはタイムアウトするまでソケット リソースを解放することはできません。これは、Winsock SPI クライアントがすぐに新しいソケットを開こうとした場合 (使用可能なソケットがない場合)、または LPWSPConnect 呼び出しを介して同じピアに接続しようとした場合にのみ顕著になる可能性があります。

LPWSPAccept または LPWSPSelect 呼び出しを取り消しても、これらの呼び出しに渡されるソケットに悪影響を与えることはありません。 特定の呼び出しのみが失敗します。取り消し前に有効であった操作はキャンセル後に有効であり、ソケットの状態はいかなる影響も受けません。

LPWSPAccept および LPWSPSelect 以外の操作を取り消しても、ソケットが不確定状態になる可能性があります。 Winsock SPI クライアントがソケットでブロッキング操作を取り消した場合、Winsock SPI クライアントがソケットで実行できる操作は LPWSPCloseSocket の呼び出しだけですが、他の操作は一部の Winsock サービス プロバイダーで動作します。 Winsock SPI クライアントで最大の移植性が必要な場合は、取り消し操作後の操作の実行に依存しないように注意する必要があります。 Winsock SPI クライアントは、SO_LINGERのタイムアウトを 0 に設定し、 LPWSPCloseSocket を呼び出すことで、接続をリセットできます。

取り消し操作によって、何らかの方法でSOCK_STREAMのデータ ストリームの整合性が損なわれると、Winsock プロバイダーは接続をリセットし、WSAECONNABORTED を使用して LPWSPCloseSocket 以外のすべての今後の操作を失敗します。

LPWSPCancelBlockingCall は、ブロッキング ネットワーク操作が取り消される前に完了した場合に正常に返すことができます。 この場合、 LPWSPCancelBlockingCall が呼び出されたことがないかのように、ブロッキング操作は正常に返されます。 Winsock SPI クライアントが操作が実際に取り消されたことを確認する唯一の方法は、ブロッキング呼び出しから WSAEINTR のリターン コードをチェックすることです。

要件

要件
サポートされている最小のクライアント Windows 2000 Professional [デスクトップ アプリのみ]
サポートされている最小のサーバー Windows 2000 Server [デスクトップ アプリのみ]
Header ws2spi.h

こちらもご覧ください

WPUQueryBlockingCallback

WSAIsBlocking

LPWSPAccept

LPWSPCloseSocket

LPWSPSelect

LPWSPSocket