Graffitiプロトコルとポート番号
最初にGraffitiプロトコルで使用するポート番号を決めます。しかし、すべてのポート番号を使えない点に注意が必要です。もし、既存のプロトコルが使用しているプロトコル番号を、勝手にGraffitiプロトコルで使用すると、サーバは既存のプロトコルだと判断してデータを処理するので、正常な処理ができなくなってしまいます。
そこで、使用してはならないポート番号が決まっています。これを「ウェルノンポート番号」と呼びます。ウェルノンポート番号は0~1024の範囲で、新しく定義するプロトコルはこの範囲の番号を使用できません。また、1024~49151の範囲のポート番号は登録済みなので、この範囲のポート番号も使用できません。従って、Graffitiプロトコルが使用できるポート番号は、49152~65535の範囲内です。
これでGraffitiプロトコルが使用するポート番号の範囲は決まりましたが、いくつのポート番号を使用するのかを決めなくてはなりません。なぜかといいますと、プロトコルは必ずしも1つのポート番号だけを使うとは決まっていないからです。
例えば、FTP(File Transfer Protocol)はデータ用に20、制御用に21のポート番号を使用しています。こうすることにより、制御とデータの送受信を同時に行えます。そのため、Graffitiプロトコルで使用するポート番号も熟慮する必要があります。
今回は取得のポート番号を49152、設定のポート番号を49153、応答のポート番号を49154とします。
次項では、Graffitiプロトコルのフォーマットを決めていきます。
Graffitiプロトコルのフォーマット
Graffitiプロトコルの動作を大別すると、描画データの取得と設定の2つになります。そこで、Graffitiプロトコルのフォーマットは、データ要求・データ応答・データ設定の3種類を用意することにします。その理由は2つあります。
まず1つ目に、取得と設定に分ける方がパケットフィルタリングしやすいからです。描画データの設定を誰でも行えるようにすると、描画する画像を壊すことも容易にできてしまいます。
2つ目の理由は、取得と設定では必要となる情報が異なるからです。取得時の情報は特にこれといって必要なデータはありません。一方、設定時には色々な情報が必要となります。また応答時の情報も異なります。この3つの動作を1つのフォーマットにしてしまうと、非常に無駄が多くなりますし、拡張しにくいものとなってしまいます。
これで2つにわける理由が分かったと思うので、フォーマットを決定していきます。最初に一番簡単な描画データの要求のフォーマットを解説します。
「Graffitiプロトコルのデータ要求フォーマット」
- 描画タイプ(1バイト)
どのような描画データを取得したいのかを表します。0は全て、1は文字列、2は直線、3は円、4は多角形、5は四角形とします。
クライアントがこのフォーマットのデータを送り、サーバが描画タイプで指定された描画データを、後述する描画データ応答のフォーマットで返します。
次は各種描画データ設定のフォーマットを定義していきます。
「描画データ設定のフォーマット共通部分」
- ID(2バイト)
- 描画タイプ(1バイト)
一連の設定を識別する為の番号です。
基本的にはデータ要求と同じものですが、指定できる値が増えます。6はペン、7はブラシ、8は描画領域、9はフォントです。また0が指定された時は、サーバに蓄えた全ての描画データを消すことにします。
各種描画データは描画タイプに基づいてフォーマットが変化します。つまり、各描画データは描画する要素の種類に応じて専用のフォーマットを定義するということです。
「色の設定フォーマット」
- 色名の長さ(1バイト)
- 色名(可変長)
色名の長さを表します。
System.Drawing. Color
に対応する色の名前です。
「ブラシの設定フォーマット」
- ブラシタイプ(1バイト)
- 背景色(可変長)
- 前景色(可変長)
- ハッチスタイルの長さ(1バイト)
- ハッチスタイル(可変長)
描画処理に使用するブラシのクラスを表す値です。0はSolidBrush、1はHatchBrush、2はLinerGradientBrushとなります。
背景色を表すフィールド。内容は色の設定フォーマットに従います。
前景色を表すフィールド。内容は色の設定フォーマットに従います。
ハッチブラシのスタイルを表す文字列の長さ。
ハッチブラシのスタイルを表す文字列。
「ペン設定のフォーマット」
- 幅(1バイト)
- ダッシュスタイル(1バイト)
- スタートラインキャップ(1バイト)
- エンドラインキャップ(1バイト)
- ラインジョイン(1バイト)
- 色(可変長)
Widthのプロパティの値を表します。
DashStyleプロパティの値を表します。
StartCapプロパティの値を表します。
EndCapプロパティの値を表します。
LineJoinプロパティの値を表します。
Penオブジェクトのコンストラクタに指定する値を表します。内容は色の設定フォーマットに従います。
「式のフォーマット」
- 演算子(1バイト)
- 値(4バイト)
座標計算に使用する際に指定する演算子です。0は加算、1は減算、3は乗算、4は除算を表します。
座標計算に使用する値を表します。任意の数を指定できますが、最大値はClientSize、最小値はペンもしくはブラシのWidthとします。
「描画領域設定のフォーマットタイプ」
- X座標の計算式数(1バイト)
- X座標の計算式(可変長)
- Y座標の計算式数(1バイト)
- Y座標の計算式(可変長)
- 幅の計算式数(1バイト)
- 幅の計算式(可変長)
- 高さの計算式数(1バイト)
- 高さの計算式(可変長)
X座標の算出に使用する式の数です。
X座標を計算する為の式を任意の数指定します。
Y座標の算出に使用する式の数です。
Y座標を計算する為の式を任意の数指定します。
幅の算出に使用する式の数です。
幅を計算する為の式を任意の数指定します。
高さの算出に使用する式の数です。
高さを計算する為の式を任意の数指定します。
式のフォーマットと描画領域設定のフォーマットは、文字列描画と図形描画に使用される共通フォーマットです。ただし、必ずしも全てのフィールドを指定するのではなく、直線と多角形を指定する際には幅と高さの計算式数が0となります。
「フォント設定のフォーマット」
- サイズ(1バイト)
- スタイル(1バイト)
- フォント名の長さ(1バイト)
- フォント名(可変長)
フォントのサイズを表します。
フォントのスタイル(太字、斜体など)を表します。値は、System.Drawing. FontStyle
と同じとします。
フォント名の長さを表します。
フォントとの名前を表す文字列です。
「文字列のフォーマット」
- 水平位置(1バイト)
- 垂直位置(1バイト)
- 文字列の長さ(4バイト)
- 描画文字列(可変長)
- 描画領域(可変長)
描画する文字列の位置を表します。値はSystem.Drawing. StringAlignment
と同じとします。
描画する文字列の位置を表します。値はSystem.Drawing. StringAlignment
と同じとします。
描画する文字列の長さです。
描画する文字列です。
描画領域設定のフォーマットタイプを参照。
「図形のフォーマット」
- 座標数(1バイト)
- 描画領域(可変長)
指定する座標の数です。多角形以外はこのフィールドの値は必ず0となります。
描画領域設定のフォーマットタイプを参照。
「描画データ応答のフォーマット共通部分」
- ID(2バイト)
- 応答数(1バイト)
- 描画データ(可変長)
応答を識別する為の番号です。
応答する描画データの個数です。
後は描画データ設定のフォーマットと同じデータを応答数と同じだけ指定します。
これでフォーマットが決定したので、Graffitiプロトコルでどうやってデータ通信をするのかを解説します。