Win32 API 日本語リファレンス
ホーム › Networking.WinSock › LPWSPRECVDISCONNECT

LPWSPRECVDISCONNECT

コールバック

シグネチャ

INT LPWSPRECVDISCONNECT(
    SOCKET s,
    WSABUF* lpInboundDisconnectData,
    INT* lpErrno
);

パラメーター

フィールド型説明
sSOCKETソケットを識別する記述子。
lpInboundDisconnectDataWSABUF*切断データのコピー先となるバッファーへのポインター。
lpErrnoINT*エラーコードへのポインター。

公式ドキュメント

LPWSPRecvDisconnect 関数は、ソケットがコネクション指向である場合に、そのソケットでの受信を終了し、切断データを取得します。

戻り値

エラーが発生しなかった場合、LPWSPRecvDisconnect は 0 を返します。それ以外の場合は SOCKET_ERROR が返され、具体的なエラーコードは lpErrno で取得できます。

エラーコード 意味
WSAENETDOWN
ネットワークサブシステムで障害が発生しました。
WSAEFAULT
lpInboundDisconnectData パラメーターが参照するバッファーが小さすぎます。
WSAENOPROTOOPT
指定されたプロトコルファミリーでは切断データがサポートされていません。
WSAEINPROGRESS
ブロッキング Windows ソケット呼び出しが進行中であるか、サービスプロバイダーがコールバック関数をまだ処理中です。
WSAENOTCONN
ソケットが接続されていません (コネクション指向のソケットのみ)。
WSAENOTSOCK
記述子がソケットではありません。

解説(Remarks)

LPWSPRecvDisconnect は、コネクション指向のソケットで受信を無効にし、リモート側から送られてくる切断データを取得するために使用します。

この関数が正常に発行された後は、そのソケットでの以降の受信は許可されません。これは下位のプロトコル層には影響しません。TCP の場合、TCP ウィンドウは変更されず、ウィンドウを使い切るまで受信データは受け付けられます (ただし確認応答は行われません)。UDP の場合、受信したデータグラムは受け付けられ、キューに入れられます。いずれの場合も ICMP エラーパケットが生成されることはありません。

受信した切断データを正しく取得するには、Windows ソケット SPI クライアントは、回線が閉じられたことを判断するために別の手段を使用する必要があります。たとえばクライアントは、FD_CLOSE 通知を受け取るか、戻り値として 0 を受け取るか、LPWSPRecv から WSAEDISCON エラーコードを受け取る必要があります。

LPWSPRecvDisconnect はソケットを閉じない点に注意してください。ソケットに割り当てられたリソースは、LPWSPCloseSocket が呼び出されるまで解放されません。

メモ

LPWSPRecvDisconnect は、ソケットの SO_LINGER 設定にかかわらずブロックしません。Windows ソケット SPI クライアントは、LPWSPRecvDisconnect を実行した後のソケットを再利用できることを前提にしてはいけません。特に、Windows ソケットプロバイダーは、そのようなソケットに対する LPWSPConnect の使用をサポートする必要はありません。

出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)