3

gprs 経由でサーバーにデータを送信するデバイスがあります。問題は、それが生データを送信し、どこで読み取りを停止できるかわからないことです

現在、私は TIdHttpServer と次のようなものを使用して文字列を読み取ります:

var
    s : string;
    repeat
       s:=s+acontext.Connection.Socket.ReadChar;
    until acontext.Connection.Socket.InputBufferIsEmpty;

私の問題に対するより良い解決策はありますか?

4

2 に答える 2

3

TCP はストリーム指向です。プロトコルが不明な場合、サーバーはバイト配列 (メモリに問題がない場合) またはファイル ストリームへの読み込みのみを試行できます。クライアントが正常に切断された場合、データは「完全」です。残念ながら、プロトコルが不明な場合、サーバーはクライアントが停止したか正常に切断されたかを判断できません。

InputBufferIsEmpty は、(TCP) バッファーにデータがある場合にのみ表示されるため、役に立ちません。レイテンシーによっては、これが頻繁に発生する可能性がありますが、飛行中のバイトがないことを意味するわけではありません。

クライアントデバイスを介して既知の文字列を送信することにより、プロトコルの「リバースエンジニアリング」を試みることができます。しかし、送信者がブラック ボックスの場合、多くの特殊なケースが考えられます。エンコードや「エスケープ」文字などを考えてみてください。

于 2012-04-11T14:24:11.683 に答える
0

独自のプロトコルを作成できます。

いくつかのアイデアは次のとおりです。

  1. 特殊文字または文字の組み合わせを使用して、メッセージの終わりを定義します。
  2. メッセージの先頭に、メッセージのサイズを持つ固定サイズのフィールドを追加します
于 2012-04-11T15:24:30.023 に答える