2017-10-23 13 views
1

私はゲームプロジェクト用のTCPネットワークを作成しています。 パケットが入ったとき、パケットの最初のバイトがそのパケットの処理タイプを決定します。パケットは、そのハンドルタイプに基づいてパケットを処理するメソッドに転送する必要があります。パケットを扱うためのデザインパターン

パケットタイプに基づいてメソッドを呼び出すことができますが、コードの重複を減らすために実装できるパターン

私はサブスクライバ/ノーティファイヤパターンをすでに使用していると思っていましたが、それには完全には反対していませんが、Subscribe(packetType、funcReference)コールをたくさん持っているかのように感じます。どちらも理想的です。

+0

OSは、IPv4プロトコル、またはIPv6 Next Headerフィールドに基づいてパケットを処理します。例えば、プロトコル「6」はTCPであるので、OSはパケットペイロードをTCPに送信する。 [プロトコル番号](https://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml)を参照してください。 –

+0

また、IPv4パケットの最初のオクテットは、バージョン( '4')の4ビットとIHLを含みます。 IPv6パケットの第1オクテットは、バージョン(「6」)の4ビットと、トラフィッククラスの場合の最初の4ビットとを含む。あなたはそれを混乱させる前に、パケット構造を学ぶべきです。 –

+0

特に重複しないようにするコードはどれですか?スイッチ/ケースステートメント自体、または何か他の? –

答えて

0

各パケットタイプを処理する大きなswitch文を持つことは完全に受け入れられます。与えられた処理されたパケットに対して複数のリゾルバがある場合でも、その場合にサブスクライブされたコールバックをトリガすることができます。

これは私の経験では、これは人が(過去に自分自身を含めていた)人が "より良い"コードのように複雑すぎるケースの1つです。スイッチは、一見すると非常に簡単であり、伸ばしやすいです。

+0

解決策として[RPC](https://en.wikipedia.org/wiki/Remote_procedure_call)を調べることもできます –

0

パケットタイプマーカーは1バイトだけなので、256個の要素のサイズを持つ関数を処理するためのポインタの配列を作ることができます。プログラム開始時に一度初期化してください。

+0

これは実質的に抽象的なアブストラクションのないサブスクライバパターンです –

+0

スイッチオペレータと同じですが、O(1)時間。スイッチはO(log(Num_Branches))で動作します。 –

関連する問題