c# supersocket 自定义协议 错误处理 粘包处理
请教一个问题。
我使用FixedHeaderReceiveFilter(头部格式固定并且包含内容长度的协议)时
如果硬件设备发送的信息 不符合我自定义协议格式,会导致后面正确数据无法解析。
正确协议格式 如下
0c 03 02 ff ff 94 35
地址 命令 长度 数据(2) CRC(2)
头部为3个字节,DTUReceiveFilter() : base(3),根据头部3个字节中最后一个字节“长度”获取头部后面的数据内容和CRC
如果设备发来了错误格式信息 aa (只有一个字节),过了一会又发来了格式正确的信息,
那么就会变成 aa 0c 03 02 ff ff 94 35
后面数据的解析会一直受影响
请问怎么解决。
硬件设备使用的modbus rtu协议,接收数据时,
会根据时间间隔(3.5个字符的静止时间,大概几毫秒吧)区分每条信息的起始。
超过3.5个字符的静止时间后,会认为是下一条新信息。
下面贴一下代码
我使用FixedHeaderReceiveFilter(头部格式固定并且包含内容长度的协议)时
如果硬件设备发送的信息 不符合我自定义协议格式,会导致后面正确数据无法解析。
正确协议格式 如下
0c 03 02 ff ff 94 35
地址 命令 长度 数据(2) CRC(2)
头部为3个字节,DTUReceiveFilter() : base(3),根据头部3个字节中最后一个字节“长度”获取头部后面的数据内容和CRC
如果设备发来了错误格式信息 aa (只有一个字节),过了一会又发来了格式正确的信息,
那么就会变成 aa 0c 03 02 ff ff 94 35
后面数据的解析会一直受影响
请问怎么解决。
硬件设备使用的modbus rtu协议,接收数据时,
会根据时间间隔(3.5个字符的静止时间,大概几毫秒吧)区分每条信息的起始。
超过3.5个字符的静止时间后,会认为是下一条新信息。
下面贴一下代码
public class DTUReceiveFilter : FixedHeaderReceiveFilter<DTURequestInfo>
{
public DTUReceiveFilter()
: base(4)
{
}
/// <summary>
/// 获取数据域和结尾字节长度
/// </summary>
/// <param name="header"></param>
/// <param name="offset"></param>
/// <param name="length"></param>
/// <returns></returns>
protected override int GetBodyLengthFromHeader(byte[] header, int offset, int length)
{
//length为头部(包含1字节的length数据长度)长度
int len = (int)header[offset + length - 1];//length只有一个字节
return len + 2;//结尾有2个字节CRC
}
/// <summary>
/// 实现帧内容解析
/// </summary>
/// <param name="header"></param>
/// <param name="bodyBuffer"></param>
/// <param name="offset"></param>
/// <param name="length"></param>
/// <returns></returns>
protected override DTURequestInfo ResolveRequestInfo(ArraySegment<byte> header, byte[] bodyBuffer, int offset, int length)
{
DTURequestInfo res = new DTURequestInfo();
string entireFrame = CRC.BytesToHexStr(header.Array) + CRC.BytesToHexStr(bodyBuffer.CloneRange(offset, length));
res.EntireFrame = entireFrame;
res.DTUDeviceID = entireFrame.Substring(0, 2);
res.TerminalDeviceAddress = entireFrame.Substring(2, 2);
res.ControlCode = entireFrame.Substring(4, 2);
res.Length = entireFrame.Substring(6, 2);
int dataLen = int.Parse(CRC.HEXtoDEC(CRC.ReverseHexString(res.Length)));
res.DataContent = entireFrame.Substring(8, dataLen * 2);
res.CRC = entireFrame.Substring(8 + dataLen * 2, 4);
return res;
}
}
...全文
相关推荐
C# SuperSocket 手把手教你入门 傻瓜教程-7(自定义SuperSocket内置的命令行协议)
自定义SuperSocket内置命令行协议: 1、用冒号:来分割请求的Key和参数部分。 2、用逗号,来分割参数部分。
C# TCP服务器编程实战:从Socket原理到高并发处理
TCP协议作为网络通信的基石,通过三次握手建立可靠连接,为应用程序提供有序、稳定的字节流传输。在C#开发中,Socket是实现TCP通信的核心接口,而TcpListener和TcpClient类进一步简化了服务器端编程。理解TCP的流式特性对于正确处理消息边界至关重要,常见的解决方案包括长度前缀和分隔符协议。在实际工程中,异步编程模型能显著提升服务器并发处理能力,有效管理大量客户端连接。针对网络异常,如SocketError 10053和10054,需要完善的错误处理机制来保证服务稳定性。这些技术广泛应用于
C# supersocket框架
1、包含服务端以及客户端程序 2、可直接运行
supersocket 服务端+客户端 DEMO
ConsoleApp1 是客户端,ServerMain是服务端,IP地址修改为自己的IP就可以运行了
C#---SuperSocket服务器端源程序.zip
C# SuperSocket框架 ---服务器端源程序,源程序包里有一个TCP测试工具,可以方便你进行测试,同时还附有测试成功的截图。


