1

パケット形式でデータを送受信するクラスがあります。このクラスには、新しいデータが物理メディアから読み取れるようになったときに実行されるイベント ハンドラーが含まれています。

イベント ハンドラーでは、メディアからデータを読み取り、使用可能なデータを解析して完全なパケットを取得します。パケットが識別されると、新しいパケットをサブスクライバーに渡すためのイベントが発生します。このイベントのサブスクライバーは、パケットを使用するかどうかを決定します。

これまでのところとても良いです... 今私の質問に。上記のシナリオは、着信データを多数のサブスクライバーに配布し、さらに処理ロジックをアプリケーションのさらに上位に配置するために機能しますが、問題が残ります。

クラスは、クラスによって送信された別のパケットへの単なる応答 (ACK/FAIL と考えてください) であるデータ パケットを受信することがあります。

イベントハンドラーで受信生データを処理するという前述の概念を壊さずに、そのような確認を待つ何かを送信するメソッドを実装するにはどうすればよいですか?

問題を説明するための擬似コード:

class CommCenter
{
    public event NewPacketAvailable;

    private void _newRawDataAvailable_EventHandler
    {
        // read incoming data from physical medium

        // parse incoming data for packet structure
        // the received packet may either contain a reply to
        // a previously sent message or unrelated

        // if packet found raise NewPacketAvailable event
        // so that subscribers can handle the packet
    }


    public void SendMessage(DataPacket packet, Int32 timeoutInMilliseconds)
    {
        // put message on the physical medium

        // wait for a packet confirming the previously sent packet
        // How would I have to do this??
        // the packet confirmation would arrive in _newRawDataAvailable_EventHandler
    }
}

たぶん、良いアイデアを持っているか、そのようなロジックを以前に実装したことさえあります。現時点ではどうしようか少し迷っています。正しい方向への助けや指針をいただければ幸いです;-)

4

1 に答える 1

1

さて、これはそれがどのように機能するかです:

イベント ハンドラで、メディアからデータを読み取ります。それがデータなのか、前のパケットの確認 (ACK) なのかを確認します。

データの場合は、それを渡します。

ACK の場合は、ACK 用のスペシャルに入れQueueます。

このメソッドでは、メッセージを送信した後、次の状態になるまでSendMessageこの ACK を繰り返します。Queue

  1. タイムアウト発生
  2. 送信したパケットの確認が届きます

それでおしまい。

于 2010-02-05T11:49:37.480 に答える