packet_manipulator_custom_filter

packet_manipulator_custom_filter サンプル

概要

packet_manipulator_custom_filter サンプルは Packet Manipulator で使用する、Custom Filter の実装方法と使用方法のサンプルとなっています。 サンプルコードでは Packet Manipulator の実装コードのフォーカスしているため、Diarkis Runtime の基本的な実装については関数化して説明等は記載していません。 Diarkis Runtime の基本的な実装について知りたい場合は room_broadcast サンプルDiarkis モジュール利用の全体的な流れ を参照してください。 また、Packet Manipulator 全般については Packet Manipulator を参照してください。

本サンプルはデバッグ機能のサンプル実装のため Release ビルドはできません。

ローカル環境でサーバーを起動する

サンプルで使用するサーバーを起動するためのチュートリアルを実施して、ローカル環境で Diarkis サーバーを起動します。

Diarkis サーバをローカルで起動する

packet_manipulator_custom_filter サンプル動作方法

サンプルをビルドして diarkis サーバアドレス, UID, クライアントキー を指定して2つ起動してください。

例) packet_manipulator_custom_filter.exe 192.168.50.111:7000 1111 AAAA packet_manipulator_custom_filter.exe 192.168.50.111:7000 2222 BBBB

2 ユーザーが Room に接続後、Packet Manipulator のフィルタ設定を Room と P2P で通信を行い Packet Filter の適用結果を表示しています。

packet_manipulator_custom_filter サンプル解説

本セクションではサンプルの実装ポイントについて解説します。 Packet Manipulator の使用方法の基本については packet_manipulator_simple サンプル をご参照ください。

Custom Filter の実装の基本

本サンプルでは Room と P2P それぞれのパケットに対してのみフィルタを適用する Custom Filter を実装しています。 ここでは P2P 用 Custom Filter を例にとり実装方法を解説します。 以下が P2P メッセージパケット用の Custom Filter の全体となります。

Packet Manipulator の User Custom Filter にあるように、基本的には各 Apply Point 専用の Filter Base を継承して Custom Filter を実装します。今回は P2PMessageReceive Apply Point のため IP2PMessageReceiveFilterBase を継承して実装しています。 Packet Filter の実装ではフィルタ適用時に実行される Apply メソッドをオーバーライドすることで処理をカスタマイズします。この Filter Base では IP2PMessageReceiveFilterArgument を受け取ることのできる Apply メソッドが純粋仮想関数として宣言されており、P2P 専用の情報を受け取って Apply 処理を実装することが可能となっています。 また、Apply メソッドの返り値でその後のパケットの扱いをコントロールすることができます。FilterPostProcess::Skip を返すことでその後、Diarkis Runtime 内ではそのパケットが無かったものとして扱われます。FilterPostProcess::ApplyNextFilter を返すと通常通りの処理を継続します。 サンプル実装では単純に確率でパケロスさせるように Apply メソッドの返り値をコントロールしています。

複雑な Custom Filter 実装

RoomPacketDelayFilter では Room の push/response パケットに対して遅延を発生させる仕組みを実装しています。

RoomPacketDelayFilter::Apply で Packet Filter 内に受け取ったパケットの情報を保存し、そのタイミングではパケットを無視するように返り値を返します。 RoomPacketDelayFilter::Apply に渡されるパケットの情報は一時的なもののため、IPacketFilterArgument::DeepCopy を使用してパケットデータのコピーを保存します。

その後、RoomPacketDelayFilter::Update で時間を計測し、遅延分の時間が経過した後に通常の受信時の処理を行うようになっています。 RoomPacketDelayFilter::Update の引数として実際にパケットを処理する関数が渡されるため、その関数を呼び出すことで通常通りのパケットの処理を行います。

最終更新

役に立ちましたか?