7

サーバーとクライアントの間で通信する方法を設定しています。私が現在どのように作業しているのかというと、ストリームの最初のバイトには何が来るのかを示すインジケーターが含まれ、そのリクエストのクラスを検索すると、リクエストの長さを判断できます。

stream.Read(message, 0, 1)

if(message == <byte representation of a known class>)
{
    stream.Read(message, 0, Class.RequestSize);
}

クラスサイズが不明な場合、既知のリクエストを読み取った後にデータが破損している場合の処理​​方法に興味があります。

ある種の区切り文字をストリームに挿入できると思っていますが、1バイトは0〜255の間しかないため、一意の区切り文字を作成する方法がわかりません。メッセージの終わりを表すパターンをストリームに配置しますか?このパターンが実際のデータと間違えられないように十分に一意であることをどのように確認できますか?

4

2 に答える 2

4

これにはさまざまなアプローチがあります。1つのオプションは、クラス名の長さとパケット全体の可能な長さを最初に送信することです(たとえば、常に最初のバイト)。このようにして、そのバイトを読み取るだけで、さらにnバイトを読み取ってクラス名を取得できます。

このアプローチにより、悪意のあるクライアントがアプリケーションをDoSする目的で送信する多くの内容を読み取ることはなく、パケットを処理するのに十分な読み取りが行われたかどうか、またはまだ完了していないかどうかをすばやく判断できます。

于 2012-12-20T14:27:35.633 に答える
0

特に区切り文字として使用される低レベルのバイトがいくつかあります。テキストの開始とテキストの終了の(16進)値は、それぞれ0x02と0x03です。そして、送信の終了、0x01および0x04と結合された見出しの開始があります。これらを使用できます。

于 2012-12-20T14:29:05.020 に答える