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,把它放到一个专用Queue的 ACK 中。

在发送消息后,在该SendMessage方法中迭代此 ACK Queue,直到:

  1. 发生超时
  2. 您发送的数据包的确认到达

就是这样。

于 2010-02-05T11:49:37.480 回答