次の方法で共有


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

LPWSPCloseSocket 関数はソケットを閉じます。

構文

LPWSPCLOSESOCKET Lpwspclosesocket;

int Lpwspclosesocket(
  [in]  SOCKET s,
  [out] LPINT lpErrno
)
{...}

パラメーター

[in] s

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

[out] lpErrno

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

戻り値

エラーが発生しない場合、 LPWSPCloseSocket は 0 を返します。 それ以外の場合は、SOCKET_ERRORの値が返され、 lpErrno で特定のエラー コードを使用できます。

エラー コード 意味
WSAENETDOWN
ネットワーク サブシステムが失敗しました。
WSAEINPROGRESS
Windows ソケット呼び出しのブロックが進行中であるか、サービス プロバイダーがコールバック関数を処理しています。
WSAENOTSOCK
記述子はソケットではありません。
WSAEWOULDBLOCK
ソケットは非ブロッキングとしてマークされ、SO_LINGERは 0 以外のタイムアウト値に設定されます。

注釈

この関数はソケットを閉じます。 より正確には、ソケット記述子 s が解放されるため、 s へのそれ 以上の参照はエラー WSAENOTSOCK で失敗します。 これが基になるソケットへの最後の参照である場合、関連付けられている名前付け情報とキューに入れられているデータは破棄されます。 ソケットで保留中のブロック呼び出しまたは非同期呼び出し (このプロセス内の任意のスレッドによって発行) は、通知メッセージを投稿せずに取り消されます。 このプロセス内の任意のスレッドによって発行された保留中の重複する操作も取り消されます。 これらの重複する操作に対して指定された完了アクション (イベント、完了ルーチン、完了ポートなど) が実行されます。 この場合、保留中の重複する操作は、エラー状態 が WSA_OPERATION_ABORTED で失敗します。 LPWSPCloseSocket が呼び出された後、FD_CLOSEはポストされません。

LPWSPCloseSocket の動作は、次のように要約されています。

  • SO_DONTLINGERが有効になっている場合 (既定の設定)、 LPWSPCloseSocket はすぐに返され、接続はバックグラウンドで正常に閉じられます。

  • SO_LINGERがゼロタイムアウトで有効になっている場合、 LPWSPCloseSocket はすぐに戻り、接続はリセット/終了されます。

    または

  • ブロッキング ソケットで 0 以外のタイムアウトでSO_LINGERが有効になっている場合、 LPWSPCloseSocket は、すべてのデータが送信されるかタイムアウトが切れるまでブロックします。

  • 非ブロッキング ソケットで 0 以外のタイムアウトでSO_LINGERが有効になっている場合、 LPWSPCloseSocket は直ちに戻り、エラーを示します。

LPWSPCloseSocket のセマンティクスは、次のようにソケット オプション SO_LINGERおよびSO_DONTLINGERの影響を受けます。

オプション Interval 閉じるの種類 閉じるのを待ちますか?
SO_DONTLINGER 気にしない グレースフル いいえ
SO_LINGER ゼロ 硬調 いいえ
SO_LINGER 0 以外 グレースフル Yes

 

 

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

ブロッキング ソケットで 0 以外のタイムアウト間隔でSO_LINGERが設定されている場合、 LPWSPCloseSocket 呼び出しは、残りのデータが送信されるまで、またはタイムアウトが切れるまでブロックソケットでブロックします。 これは、正常な切断と呼ばれます。 すべてのデータが送信される前にタイムアウトが切れた場合、サービス プロバイダーは LPWSPCloseSocket が返される前に接続を終了する必要があります。

非ブロッキング ソケットで 0 以外のタイムアウト間隔でSO_LINGERを有効にすることはお勧めしません。 この場合、閉じる操作をすぐに完了できない場合、 LPWSPCloseSocket の呼び出しは WSAEWOULDBLOCK というエラーで失敗します。 LPWSPCloseSocket が WSAEWOULDBLOCK で失敗した場合、ソケット ハンドルは引き続き有効であり、切断は開始されません。

Winsock SPI クライアントは、ソケットを閉じるには LPWSPCloseSocket をもう一度呼び出す必要がありますが、Winsock SPI クライアントが次のいずれかの処理を行わない限り 、LPWSPCloseSocket は失敗し続けることができます。

  • SO_DONTLINGERを無効にします。
  • タイムアウトが 0 のSO_LINGERを有効にします。
  • LPWSPShutdown を呼び出してクロージャを開始します。

ストリーム ソケットにSO_DONTLINGERが設定されている場合 (つまり、残留構造体の l_onoff メンバーが 0 の場合)、 LPWSPCloseSocket 呼び出しは直ちに返され、ソケットがブロックされているか非ブロッキングであるかに関係なく、WSAEWOULDBLOCK は取得されません。 ただし、可能であれば、基になるソケットが閉じられる前に、転送のためにキューに入れられているデータが送信されます。 これは正常な切断と呼ばれ、既定の動作です。

この場合、Winsock プロバイダーは、正常な切断が完了するか、プロバイダーによって決定された時間内に操作を完了できないために接続を終了するまで、ソケットに関連付けられているリソースを保持できます。 これは、使用可能なすべてのソケットの使用を想定している Winsock クライアントに影響を与える可能性があります。 これは既定の動作です。SO_DONTLINGERは既定で設定されています。

要件

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

こちらもご覧ください

LPWSPAccept

LPWSPIoctl

WSPSetSockOpt

LPWSPSocket