C#如何在数据通信中实现等待确认?

问题描述:

我有一个类应该以包的形式发送/接收数据。该类包含一个事件处理程序,当新数据可用于从物理介质读取时运行。C#如何在数据通信中实现等待确认?

在事件处理程序中,我从介质中读取数据并解析完整数据包的可用数据。一旦数据包被识别,就会引发一个事件将新数据包传递给用户。这个事件的用户决定他们是否要使用这个数据包。

到目前为止好...现在我的问题。尽管上面的场景将传入的数据分配给多个用户,并在应用程序中进一步放置进一步的处理逻辑,但它给我留下了一个问题:

有时候类会收到一个数据包,它只是一个回复认为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 
    } 
} 

也许有一个好主意,或者甚至之前实现这样的逻辑。我现在有点困惑,该怎么做。很高兴的任何帮助或指针的方向是正确;-)

+0

找到任何解决方案? – 2010-02-01 14:29:51

+0

是的,请参阅我的答案,以获得我如何解决问题的简要说明。如果你需要任何细节让我知道,我会很乐意详细说明。 – 2010-02-05 11:50:42

好了,这是它如何工作的:

在事件处理中,从介质读取数据。检查它是数据还是仅仅对先前数据包(ACK)的确认。

如果是数据,则将其传递。

如果是ACK,则将其放入ACK的特殊Queue

在发送您的消息,直到后SendMessage方法遍历这个ACK Queue

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

就是这样。