C++ TCP クライアント プログラムをアップグレードして Windows 7 と互換性を持たせようとしています。プログラムはノンブロッキング ソケットを使用するように設定されており、Windows XP で問題なく動作します。しかし、Windows 7 で同じコードを実行したところ、ソケット クラスの recv 関数の動作が異なることがわかりました。
PC からイーサネット ケーブルを切断しようとすると、Windows XP と Windows 7 の両方がシステム トレイでネットワークが切断されていることを検出します。でも、
Windows XP では、recv は SOCKET_ERROR を返し、WSAGetLastError は WSAECONNRESET を返します。
Windows 7 では、recv は SOCKET_ERROR を返しますが、WSAGetLastError は WSAEWOULDBLOCK を返します。
ソケット recv 関数が、ソケットがまだ接続されていると見なし (つまり、WSAEWOULDBLOCK を返す)、キープアライブ タイムアウト後に切断があることのみを検出する理由に興味があります。
また、recv 関数を呼び出した後に WSAGetLastError の値を確認する以外に、TCP ソケット ライブラリを使用してネットワークが切断されたことを検出する別の方法はありますか?
どうもありがとう!