LPWSPRECVDISCONNECT
コールバックシグネチャ
INT LPWSPRECVDISCONNECT(
SOCKET s,
WSABUF* lpInboundDisconnectData,
INT* lpErrno
);パラメーター
| フィールド | 型 | 説明 |
|---|---|---|
| s | SOCKET | ソケットを識別する記述子。 |
| lpInboundDisconnectData | WSABUF* | 切断データのコピー先となるバッファーへのポインター。 |
| lpErrno | INT* | エラーコードへのポインター。 |
公式ドキュメント
LPWSPRecvDisconnect 関数は、ソケットがコネクション指向である場合に、そのソケットでの受信を終了し、切断データを取得します。
戻り値
エラーが発生しなかった場合、LPWSPRecvDisconnect は 0 を返します。それ以外の場合は SOCKET_ERROR が返され、具体的なエラーコードは lpErrno で取得できます。
| エラーコード | 意味 |
|---|---|
| ネットワークサブシステムで障害が発生しました。 | |
| lpInboundDisconnectData パラメーターが参照するバッファーが小さすぎます。 | |
| 指定されたプロトコルファミリーでは切断データがサポートされていません。 | |
| ブロッキング Windows ソケット呼び出しが進行中であるか、サービスプロバイダーがコールバック関数をまだ処理中です。 | |
| ソケットが接続されていません (コネクション指向のソケットのみ)。 | |
| 記述子がソケットではありません。 |
解説(Remarks)
LPWSPRecvDisconnect は、コネクション指向のソケットで受信を無効にし、リモート側から送られてくる切断データを取得するために使用します。
この関数が正常に発行された後は、そのソケットでの以降の受信は許可されません。これは下位のプロトコル層には影響しません。TCP の場合、TCP ウィンドウは変更されず、ウィンドウを使い切るまで受信データは受け付けられます (ただし確認応答は行われません)。UDP の場合、受信したデータグラムは受け付けられ、キューに入れられます。いずれの場合も ICMP エラーパケットが生成されることはありません。
受信した切断データを正しく取得するには、Windows ソケット SPI クライアントは、回線が閉じられたことを判断するために別の手段を使用する必要があります。たとえばクライアントは、FD_CLOSE 通知を受け取るか、戻り値として 0 を受け取るか、LPWSPRecv から WSAEDISCON エラーコードを受け取る必要があります。
LPWSPRecvDisconnect はソケットを閉じない点に注意してください。ソケットに割り当てられたリソースは、LPWSPCloseSocket が呼び出されるまで解放されません。
LPWSPRecvDisconnect は、ソケットの SO_LINGER 設定にかかわらずブロックしません。Windows ソケット SPI クライアントは、LPWSPRecvDisconnect を実行した後のソケットを再利用できることを前提にしてはいけません。特に、Windows ソケットプロバイダーは、そのようなソケットに対する LPWSPConnect の使用をサポートする必要はありません。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)