SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

仮想ネットワークの実装で学ぶTCP/IP

仮想ネットワーク実装でTCP/IPを学ぼう(7)
― GDI+と独自プロトコルの定義

仮想ネットワーク実装でTCP/IPを学ぼう(7)


  • X ポスト
  • このエントリーをはてなブックマークに追加

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バイト)
  •  描画処理に使用するブラシのクラスを表す値です。0はSolidBrush、1はHatchBrush、2はLinerGradientBrushとなります。

  • 背景色(可変長)
  •  背景色を表すフィールド。内容は色の設定フォーマットに従います。

  • 前景色(可変長)
  •  前景色を表すフィールド。内容は色の設定フォーマットに従います。

  • ハッチスタイルの長さ(1バイト)
  •  ハッチブラシのスタイルを表す文字列の長さ。

  • ハッチスタイル(可変長)
  •  ハッチブラシのスタイルを表す文字列。

「ペン設定のフォーマット」
  • 幅(1バイト)
  •  Widthのプロパティの値を表します。

  • ダッシュスタイル(1バイト)
  •  DashStyleプロパティの値を表します。

  • スタートラインキャップ(1バイト)
  •  StartCapプロパティの値を表します。

  • エンドラインキャップ(1バイト)
  •  EndCapプロパティの値を表します。

  • ラインジョイン(1バイト)
  •  LineJoinプロパティの値を表します。

  • 色(可変長)
  •  Penオブジェクトのコンストラクタに指定する値を表します。内容は色の設定フォーマットに従います。

「式のフォーマット」
  • 演算子(1バイト)
  •  座標計算に使用する際に指定する演算子です。0は加算、1は減算、3は乗算、4は除算を表します。

  • 値(4バイト)
  •  座標計算に使用する値を表します。任意の数を指定できますが、最大値はClientSize、最小値はペンもしくはブラシのWidthとします。

「描画領域設定のフォーマットタイプ」
  • X座標の計算式数(1バイト)
  •  X座標の算出に使用する式の数です。

  • X座標の計算式(可変長)
  •  X座標を計算する為の式を任意の数指定します。

  • Y座標の計算式数(1バイト)
  •  Y座標の算出に使用する式の数です。

  • Y座標の計算式(可変長)
  •  Y座標を計算する為の式を任意の数指定します。

  • 幅の計算式数(1バイト)
  •  幅の算出に使用する式の数です。

  • 幅の計算式(可変長)
  •  幅を計算する為の式を任意の数指定します。

  • 高さの計算式数(1バイト)
  •  高さの算出に使用する式の数です。

  • 高さの計算式(可変長)
  •  高さを計算する為の式を任意の数指定します。

 式のフォーマットと描画領域設定のフォーマットは、文字列描画と図形描画に使用される共通フォーマットです。ただし、必ずしも全てのフィールドを指定するのではなく、直線と多角形を指定する際には幅と高さの計算式数が0となります。

「フォント設定のフォーマット」
  • サイズ(1バイト)
  •  フォントのサイズを表します。

  • スタイル(1バイト)
  •  フォントのスタイル(太字、斜体など)を表します。値は、System.Drawing. FontStyleと同じとします。

  • フォント名の長さ(1バイト)
  •  フォント名の長さを表します。

  • フォント名(可変長)
  •  フォントとの名前を表す文字列です。

「文字列のフォーマット」
  • 水平位置(1バイト)
  •  描画する文字列の位置を表します。値はSystem.Drawing. StringAlignmentと同じとします。

  • 垂直位置(1バイト)
  •  描画する文字列の位置を表します。値はSystem.Drawing. StringAlignmentと同じとします。

  • 文字列の長さ(4バイト)
  •  描画する文字列の長さです。

  • 描画文字列(可変長)
  •  描画する文字列です。

  • 描画領域(可変長)
  •  描画領域設定のフォーマットタイプを参照。

「図形のフォーマット」
  • 座標数(1バイト)
  •  指定する座標の数です。多角形以外はこのフィールドの値は必ず0となります。

  • 描画領域(可変長)
  •  描画領域設定のフォーマットタイプを参照。

「描画データ応答のフォーマット共通部分」
  • ID(2バイト)
  •  応答を識別する為の番号です。

  • 応答数(1バイト)
  •  応答する描画データの個数です。

  • 描画データ(可変長)
  •  後は描画データ設定のフォーマットと同じデータを応答数と同じだけ指定します。

 これでフォーマットが決定したので、Graffitiプロトコルでどうやってデータ通信をするのかを解説します。

次のページ
Graffitiプロトコルでのデータ通信

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
仮想ネットワークの実装で学ぶTCP/IP連載記事一覧

もっと読む

この記事の著者

インドリ(インドリ)

分析・設計・実装なんでもありのフリーエンジニア。ブログ「無差別に技術をついばむ鳥(http://indori.blog32.fc2.com/)」の作者です。アドバイザーをしたり、システム開発したり、情報処理技術を研究したりと色々しています。座右の銘は温故知新で、新旧関係なく必要だと考えたものは全て学...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/5170 2010/06/17 10:35

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング