photonとの通信で接続が切れたことを検知する
photonとの接続が切断されたことを検知する方法を調べたのでメモ
公式のドキュメントはこちら
https://doc.photonengine.com/ja-jp/realtime/current/reference/analyzing-disconnects
photonのサーバとクライアントはheartbeatのメッセージを投げあって、接続されているか常に確認しあっている模様
Photon接続の両側(クライアントとサーバ)は送信したリライアブルコマンドが相手側に届いたことをを監視します。即時に (現在の往復時間に基づいて)ACKがない場合、リライアブルコマンドを再送します。
よって、このメッセージの応答がサーバから返らないことを検知できれば切断を検知したことになる。
photonのc++のsdkを見ると、Listenerとして以下のようなinterfaceが定義されている。 http://doc-api.photonengine.com/en/cpp/current/
これらを呼び出すの部分をc++ sdk(v4.1.9.0)内で探すとLoadBalancing::Client::onStatusChanged()
にある。その中でstatusに応じて対応するlistenerが呼ばれている。statusは以下のファイルで定義されており、それぞれコメントが書いてあったのでgistに貼った。
ExitGames::Photon::StatusCode
https://gist.github.com/y-kamiya/eb3d2dfdf05952bfa4d8cef1ef643940
onStateChangeのロジックと対応させて見ると、切断に関するlistenerは以下のような感じだった。
- clientErrorReturn
- クライアントからパケットを送出できなかった場合
- 対応するstatusCode
- SEND_ERROR
- connectionErrorReturn
実際にlistenerが呼ばれる場合を試してみたところ少なくとも以下は確認できた
- 自分の端末を機内モードやwifi OFFなどした場合
- 自端末でclientErrorReturnが呼ばれる
- 通信相手の端末を機内モードやwifi OFFなどした場合
- 自端末でconnectionErrorReturnが呼ばれる
ちなみに、connectionErrorReturnの場合はその中でdisconnet()も呼んでいるため、その後disconnetReturnも呼ばれる