質問: Casablanca(C++ REST SDK)を使ってWin/Mac用のWebSocket通信処理を書いています。 WebSocketが切れてしまった場合にはすぐに再接続をかけることで不安定な通信環境にも強くしようとしているのですが、思った通りに動かない点があり困っています。 うまく動かないというのは、NWが切れたとき(WiFiをオフにしたときや、LANケーブルを抜いたとき)に何のイベントも発生せず、従って再接続処理を動かせないということです。 イベントが発生しないというのは、実際にはWebSocket接続が生きたままだということを意味していて、だからLANケーブルを挿し直すと通信は再開します。それで良いじゃないかと言われるとそれは微妙でして、例えばWi-Fiが切れたらすぐに4Gを使って再接続したいのに無駄に生きているWebSocket接続がじっとWi-Fiの復旧を待ち続けて何も報告してこないので4Gで再接続する処理が始められないということになるので困るのです。 NWが切れたとき、 * set_close_handler でセットしたハンドラは呼ばれません(OS X環境だと、切れて2分くらいしたらやっと呼ばれました)。 * send でメッセージを送ろうとしても例外は吐かれることなく成功してしまいます。送信タスクのwait()もすぐ終わります。(こちらも、切れて2分くらいしたら例外を吐くようになります) ポーリング的な手段でも良いので、何かWebSocket再接続を必要とする状況を検知する方法はないものでしょうか。
回答: websocketのプロトコル仕様に接続確認用途の制御フレームとしてPING,PONGが定義されています。 CasablancaはおろかC++すらろくに使えないので恐縮ですが、リファレンスをググってみたところwebsocket_message_typeにping,pongの定義があるようですので、CasablancaでもPING,PONGでのやり取りは実現できそうに見えます。 よって、サーバ側から定期的にPING送信を行い、一定時間PONG応答が来ない場合にClosing処理を行うように実装することで目的を達成できないでしょうか?