C#中的多部分消息流处理

时间:2015-08-03 15:25:53

标签: c# parsing tcp persistence

我需要解析包含协议定义的二进制格式消息的TCP数据流,这些消息可能是也可能不是多部分的。消息中的标题指示消息是否包含多个部分(第1部分,共4部分等)。我正在使用消息类成功解析单部分消息,该消息类将字节数据解码为类成员 - 这占所有流量的约95%。

我是C#-dotNet的新手,我在C ++方面拥有大部分经验,而旧的管理方法是拥有一个字段端点数组,可以存储对我可以增长为的数据结构的引用在接收端重建消息时需要。我已经研究过C#等价物的可能方法,但它们似乎是面向HTTP的,并且使用文件系统进行临时存储,但我正在寻找一种在内存中构建消息的方法。我对C#类,持久性,垃圾收集等的掌握仅限于我不确定方法的程度。

我的TCP处理程序有一个回调消息处理程序,用于解析' abc'协议:

{{1}}

processTcpPacket()是异步的,并从许多端点传递消息;每条消息中的标头都有完整的源和目标地址。该协议将长消息分成大约200字节的段,这些段被发送到接收器并重新组装 - 最大有效载荷可以达到~5000字节。

在C ++世界中,我将为具有sendee源地址的多部分消息创建一个存储容器,这样我就可以找到正确的容器并继续添加消息部分,直到消息完成,然后处理消息并删除临时容器。我可以使用C#进行类似的过程吗?

1 个答案:

答案 0 :(得分:1)

  

除非我忽略了这一点,否则这些都不允许我创建一个   反对'记住'部分数据直到下一次异步   打回来。此对象必须在回调之外保留...

正确...在类级别声明字典,以便在调用过程中保持不变并添加" abc'使用源地址作为密钥的实例。

这里有一些非常粗略的伪代码:

Dictionary<sourceAddress, abcMessage> msgs = new Dictionary<sourceAddress, abcMessage>();

void processTcpPacket(StateObject tcpControl)
{
    if (msgs.ContainsKey(sourceAddress))
    {
        abcMessage abc = msgs[sourceAddress]; // pull partial from the dictionary
        abc.AddParse(tcpControl.buffer,tcpControl.size); // do you have a way to ADD a message yet?
        if(abc.complete)
        {
            do something with this message()
        }
        // if partial, it's already stored in the dictionary, leave it there
    }
    else
    {
        abcMessage abc = new abcMessage();
        abc.parse(tcpControl.buffer,tcpControl.size)
        if(abc.complete)
        {
            do something with this message()
        }else if abc.multipart{
            msgs.Add(sourceAddress, abc); // hold this message somewhere until the next part shows up... ?              
        }else{
            discard unparseable message()
        }
    }
}

不确定要存储&#34; sourceAddress&#34;键类型为。它可以是IP的字符串形式,也可以是其他一种唯一标识源的方式。