20. VSocket
20.1. VSocketの概要
VSocket は UDP によるソケット通信に似たインターフェースを提供する低レベルな通信ライブラリです。 VSocket を使うと NEX のサーバー機能や NAT トラバーサル機能や暗号化・改ざん検知機能を利用しつつ クライアント同士の P2P 通信に任意のサードパーティー製のネットワークエンジンを利用できるようになります。 サードパーティー製のネットワークエンジンからソケット API を呼び出している箇所を VSocket の API を呼び出すように変更して使用されることを想定しています。
VSocket はソケットの UDP と同様にコネクションレスなプロトコルであり、信頼性や順序性を保証しません。 一般に端末は NAT デバイスの配下に置かれている事が多いため、VSocket による通信を行う前に NAT トラバーサルを行う必要があります。 NAT トラバーサル機能については 21. もご覧ください。 通信経路上の NAT デバイスの NAT テーブルを維持するため、アプリケーション側でキープアライブを行う必要があります。
1250 (VSocket::MAX_DATA_SIZE) バイトまでのサイズを送信できます。 改ざん検知機能を備えるため、VSocket ライブラリを持たない独自サーバーとの通信は行うことができません。
20.2. 注意事項
VSocketを利用する場合は以下の実装を行う必要があります。
- VSocket による通信を開始する前に NAT トラバーサルを行う必要があります。通信を開始する前に ConnectivityManager::StartNATSession() と VSocket::ProbeStations() による NAT トラバーサルを行い、通信の終了後に ConnectivityManager::StopNATSession() に呼んでください。
- 対戦相手を変えたりする場合は、 VSocket オブジェクトを破棄する度に ConnectivityManager::StopNATSession(), ConnectivityManager::StartNATSession() を呼びなおしてください。
- 長時間無通信状態が続くと、通信経路上の NAT デバイスは NAT トラバーサルにより構築した NAT テーブルのエントリを削除し、その結果 VSocket による通信が継続できなくなります。これを避けるため、全ての VSocket の通信相手と 10 秒以上無通信状態にならないようにしてください。無通信状態が続く場合は能動的にキープアライブパケットを送信してください。
VSocket の送受信バッファはパケットバッファマネージャーによって固定長のメモリプールで管理されます。 パケットバッファの空きが不足した場合、VSocket::SendTo() は VSocket::PacketBufferFull を返します。 VSocket::PacketBufferFull が発生した場合は、Scheduler::Dispatch() を行い時間をおいてから必要に応じて再度送信を行うか、パケットバッファを増やしてください。 パケットバッファについては、 「メモリ管理」のパケットバッファのメモリ管理 を参照してください)
20.3. 実装について
VSocket サンプルデモを参照してください。 サンプルデモではフルメッシュ型ネットワークトポロジ及びサーバクライアント(スター)型ネットワークトポロジを構築する例を示しています。
20.3.1. ホストマイグレーション
アプリケーションで構築した P2P セッションからホスト役の端末の切断があった場合にマッチメイク及び P2P セッションへの参加を継続してサポートしたい場合は、新しいホスト役の端末から MatchMakingClient::UpdateSessionHost() を呼び出し、ゲームサーバーに登録されているホスト情報を更新する必要があります。
補足
VSocket で接続する端末の情報は MatchMakingClient::GetSessionURLs() や MatchMakingClient::GetParticipantsURLs() で取得します。 特に MatchMakingClient::GetSessionURLs() で取得する端末の情報は、最初はマッチメイクセッションを作成した端末のものとなります。 もしこのホスト役の端末が P2P セッションから抜けた後は MatchMakingClient::GetSessionURLs() で情報を取得する事ができなくなり、P2P セッションへの参加が不可能になります。 ホスト情報を新たに登録したり更新したりする関数が MatchMakingClient::UpdateSessionHost() です。
20.3.2. エラーハンドリングについて
VSocket::ProbeStations() で、NAT トラバーサル処理に失敗した場合には、 CallContext::GetOutcome() で QERROR(Transport, NatTraversalError) が取得されます。 この場合は、ネットワークエラーコードを取得し、 エラー・EULAアプレットに渡した後に通信の終了処理を行ってください。(「NEXライブラリ全般」の非同期処理 を参照してください)