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
}
}
也许有一个好主意,或者甚至之前实现这样的逻辑。我现在有点困惑,该怎么做。很高兴的任何帮助或指针的方向是正确;-)
答
好了,这是它如何工作的:
在事件处理中,从介质读取数据。检查它是数据还是仅仅对先前数据包(ACK)的确认。
如果是数据,则将其传递。
如果是ACK,则将其放入ACK的特殊Queue
。
在发送您的消息,直到后SendMessage
方法遍历这个ACK Queue
:
- 超时
- 确认您发送的数据包到达
就是这样。
找到任何解决方案? – 2010-02-01 14:29:51
是的,请参阅我的答案,以获得我如何解决问题的简要说明。如果你需要任何细节让我知道,我会很乐意详细说明。 – 2010-02-05 11:50:42