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
    • タイムアウトやサーバ側からの切断要求、なんらかの例外発生
    • 対応するstatusCode
      • EXCEPTION
      • EXCEPTION_ON_CONNECT
      • INTERNAL_RECEIVE_EXCEPTION
      • TIMEOUT_DISCONNECT
      • DISCONNECT_BY_SERVER
      • DISCONNECT_BY_SERVER_USER_LIMIT
      • DISCONNECT_BY_SERVER_LOGIC

実際にlistenerが呼ばれる場合を試してみたところ少なくとも以下は確認できた

  • 自分の端末を機内モードwifi OFFなどした場合
    • 自端末でclientErrorReturnが呼ばれる
  • 通信相手の端末を機内モードwifi OFFなどした場合
    • 自端末でconnectionErrorReturnが呼ばれる

ちなみに、connectionErrorReturnの場合はその中でdisconnet()も呼んでいるため、その後disconnetReturnも呼ばれる