2

インデックスが増え続ける(n ++)データを送信するデータストリームがあります。そのデータの一部が順不同で送信されたり、失われたり、その他の方法で再送信される必要がある可能性があります。

  1. アプリによって監視されているセキュリティログファイルがあるとします。悪意のある人がいくつかのエントリの送信を抑制または阻止する可能性があります。私はこの事実に注意を向けたいと思います。

  2. また、このデータが順不同でログレコーダーに送信される可能性があると想定します。

この論理は、私が車輪の再発明をしたくなく、効率的ではないことをしたくないところにあるようです。

質問

受信したデータを順不同で追跡し、欠落しているデータをシーケンスに含めることができるようにするには、どのように実装する必要がありますか(またはどのリファレンス実装が存在しますか)?

(また、この質問のタグ付けにご協力いただければ幸いです)

4

3 に答える 3

1

さて、私はリンクリストを使用してこれを行いました。これについて、どこかで事前の作業が必要です...いずれにせよ、これは、多かれ少なかれ増加している入力系列用に最適化されています。

バグや私ができる機能強化を見つけたら教えてください

    public class ContiguousDataValue
    {
        public int UpperInt { get; set; }
        public int LowerInt { get; set; }

        public override string ToString()
        {
            return "Upper" + UpperInt + " Lower" + LowerInt; 
        }
    }


public class ContiguousData 
{
    LinkedList<ContiguousDataValue> ranges = new LinkedList<ContiguousDataValue>();

    public void AddValue(int val)
    {
        for (LinkedListNode<ContiguousDataValue> range = ranges.Last; range != null; range = range.Previous)
        {
            if (val > range.Value.UpperInt)
            {
                // increment current node if applicable 
                if (val == range.Value.UpperInt + 1)
                    range.Value.UpperInt = val;
                else
                    ranges.AddAfter(range, new ContiguousDataValue() { UpperInt = val, LowerInt = val });
                return;
            }
            else if (val < range.Value.LowerInt)
            {
                if (val == range.Value.LowerInt - 1)
                {
                    range.Value.LowerInt = val;
                    return;
                }
                else
                {
                    continue;
                }
            }
        }
        // Anything that reaches this line is either a very new low value, or the first entry
        ranges.AddLast(new ContiguousDataValue() { UpperInt = val, LowerInt = val });
    }
 }
于 2012-05-13T13:24:34.493 に答える
0

あなたはあなたのOQでの標準的な実装について言及しました:TCP。したがって、TCPを介してデータを送信すると、いくつかの歓迎すべき結果が生じます。

  • データが順不同で到着した場合はいつでも、送信プロセスまたは受信プロセスのいずれかが誤動作していると安全に想定できます。
  • シーケンスでデータが欠落している場合は常に、同じと見なすことができます
  • 確認応答についても同じことが言えます。そのため、送信プロセスには常に完全な最後の既知の問題があります。

トランスポートとしてTCPを使用し、(これが直接実行可能でない場合は)TCPデータグラムを他のネットワークストリームにカプセル化することを強くお勧めします。

つまり、正規の実装を実装にします。

于 2012-05-12T16:39:53.967 に答える
0

まず、潜在的な競合状態がある場合は、それを修正する必要があります。

TCPは、待機することにより、データの順序が狂うという問題を克服します。パケット6がパケット4の後に到着した場合、TCPはパケット5が到着するまで待機します。パケット5が一定期間到着しない場合、TCPはパケット5の再送信を要求します。これにより、パケット5が再送されます。

(注-TCP / IPはパケットではなくバイトをカウントすることを知っていますが、ここでは関係ありません)

「ダム組み込みデバイス」に再送信を依頼できる場合は、同じ手法を使用できます。私はあなたがそれをすることができないと確信しているので、あなたは別のメカニズムに頼る必要があるでしょう。これは、TCPが行うことと似ている可能性があります。エントリが欠落していると判断するまで、待機する時間を決定する必要があります。

于 2012-05-12T19:53:39.940 に答える