ネットワークプログラミング(8)カスタムネットワーク通信プロトコル


C/C++ネットワーク通信は本当に使う必要があります.良いネットワークサーバを書くだけでなく、通信プロトコルを決めてこそ、本当に実用的になります.
通信プロトコル業界は現在、XMPPのようなオープンソースを使用する以外、基本的には通信プロトコルをカスタマイズし、パッケージを封印し、パッケージを分解する責任を負っている.
なぜプロトコルパッケージを自分で定義するのですか?1つの理由は、本当のビジネスロジックは複雑で、単純な文字列や数字ではないことが多いからです.前に書いた<<ネットワークプログラミング(7)バイト順がプラットフォーム間データ伝送に与える影響>>を参考にすると、通信時のネットワーク伝送はバイト単位であることがわかります.この一連のデータストリームはインタラクティブであり、データストリームの各インタラクションでどのように正確に認識できるか.
本当に役に立つものは、双方が方法を定義しなければならない.送信側は,送信するものを東から並べてパケットを定義し,ネットワークバイト順に変換して送信する.受信者が受信した後,パケットの定義に従って有用なデータを分解する.
パッケージ定義にはそれぞれのやり方がありますが、通常は次の部分が含まれます.
パッケージタイプ:ビジネスロジックでコンテンツ長を区別するために使用する:データを転送する長さメッセージ内容:今回実際に転送するデータチェックビット:チェック用、パケットミス防止
パッケージは通常、構造体であり、次のように定義できます.
typedef struct _Packet{
	unsigned short pkg_type;
	unsigned int pkg_len;
	char pkg_content[pkg_len];
	unsigned short pkg_cs;
}Packet;

次のようにすることもできます.
typedef struct _PacketHeader{
	unsigned short pkg_type;
	unsigned short pkg_len;
}PacketHeader;

typedef struct _PacketBody{
	struct _PacketHeader pkg_header;
	char pkg_content[pkg_len];
	......
}Packet;
または他の方法.
通常、これらの構造体はマクロまたは関数で
パケットコンテンツはネットワークバイトシーケンス(char)に変換され、受信者はそれらを解析してパケットを解く.
前述したように、パケットを定義する理由の1つは、データ転送において、必ずしも順風満帆ではないことです.
その結果、他の意外なことが起こり、完全なデータを受け取っていないか、受け取ったデータがあなたが望んでいない可能性があります.完全な通信プロトコルは
完全性を有効に検出し、必要なデータを区別します.
いくつかの例外を列挙する
粘着パック:tcpは効率を高めるため(Nagleアルゴリズムを用いる)N個のパックをバッファリングしてから一緒に出す.
パケット:データが不完全で、データは一度ではなく、何度かに分けて到着します.
不正パッケージ:転送されたデータストリームがプロトコルに合致しません.これはパケットタイプ,パケット長,有効ビットを比較することによって検出される.
とにかく実用的なネット通信を作るには考えなければならないことが多いので、このようなプログラムを書くのは本当に難しいです.
MAIL: [email protected]
BLOG: http://blog.csdn.net/xcl168