粘包处理现象及其解决方案——基于NewLife.Net网络库的管道式帧长粘包处理方法 (3)

#6.长度计算委托GetLength 5.3.6中会调用如下每个包的长度计算委托。关于委托的使用方法会在下一篇讲解,这里不再展开。

// // 摘要: // 从数据流中获取整帧数据长度 // // 参数: // pk: // // offset: // // size: // // 返回结果: // 数据帧长度(包含头部长度位) protected static int GetLength(Packet pk, int offsetint size) { if (offset < 0) { return pk.Total - pk.Offset; } int offset2 = pk.Offset; if (offset >= pk.Total) { return 0; } int num = 0; switch (size) { case 0: { MemoryStream stream = pk.GetStream(); if (offset > 0) { stream.Seek(offset, SeekOrigiCurrent); } num = stream.ReadEncodedInt(); num += (int)(stream.Position - offset); break; } case 1: num = pk[offset]; break; case 2: num = pk.ReadBytes(offset, 2).ToUInt16(); break; case 4: num = (int)pk.ReadBytes(offset, 4).ToUInt32; break; case -2: num = pk.ReadBytes(offset, 2).ToUInt16(0isLittleEndian: false); break; case -4: num = (int)pk.ReadBytes(offset, 4).ToUInt(0, isLittleEndian: false); break; default: throw new NotSupportedException(); } if (num > pk.Total) { return 0; } return num; }

#7.最终粘包拆分效果图

粘包处理现象及其解决方案——基于NewLife.Net网络库的管道式帧长粘包处理方法

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://www.cnblogs.com/JerryMouseLi/p/12659903.html

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpwzjj.html