タイトルが示すように、私は winsock と boost ソケットの両方を使用してきました。切断を検出するのが非常に困難です。
まず、切断は次の方法で検出できることを知っています。
- recv() / async_read() は、ソケット エラーまたは 0 を返します。
- send() / async_write() ... ... ...
- クライアントが手動で閉じられたか、中断されたか、プログラムが閉じられたか-何でも。
問題のシナリオは次のとおりです。
closesocket() で接続を閉じます。クライアントは切断を検出します - すべて問題ありません。
プログラムを閉じます。50/50 の確率で、クライアントが切断を検出できません。何らかの理由で、オーバーラップした IO WSARecv() が検出される保証はありません。
プロセスを殺します。チャンスは検出の 80% に増加します。But for the rest of the 20% - here's what's bothering me. I implemented a keep-alive ping mechanism which sends data to the server. Even if I killed the program - the server is still async_writing() to the connection - even though it's not detected or dead.
これは私が一緒に暮らさなければならないものですか?切断を検出するために全力を尽くしたので、私はちょっと迷っています...それでもまだ問題があります。