DB11 TCP数据协议拆包接收主要方法

北京地标(DB11) 据接收器.

    /// <summary>
    /// DB11协议拆包器
    /// </summary>
    public class SplictProtocol
    {

        /// <summary>
        /// 用于处理数据协义的功能
        /// </summary>
        List<byte> bytes = new List<byte>(5000);

        private int len = -1;
        /// <summary>
        /// 包头
        /// </summary>
        private bool FindPackageHead = false;
        /// <summary>
        /// 索引
        /// </summary>
        int index = -1;
        public List<byte[]> Splict(byte[] arr)
        {
            List<byte[]> list = new List<byte[]>();
            try
            {

                if (arr != null)
                {
                    //锁处理
                    lock (bytes)
                    {
                        //开始从队列中取数据
                        for (int k = 0; k < arr.Length; k++)
                        {
                            //队列有数据
                            byte b = arr[k];
                            //如果超过最大接收字节数
                            if (1000 * 1024 <= bytes.Count)
                            {
                                bytes.Clear();
                            }
                            //添加到对像集合
                            bytes.Add(b);
                            //3.从集合的前面开始取数据.找包头,进行拆包
                            if (bytes.Count >= 24)
                            {
                                if (!FindPackageHead)
                                {
                                    for (int i = 0; i < bytes.Count; i++)
                                    {
                                        if (bytes[i] == 0x23 && (i + 1 < bytes.Count && bytes[i + 1] == 0x23))
                                        {
                                            index = i;
                                            FindPackageHead = true;
                                            break;
                                        }
                                    }
                                }

                                if (index > -1)
                                {
                                    //22 数据单元长度索引
                                    if (bytes.Count > index + 23)
                                    {

                                        if (len == -1)
                                        {
                                            int xx = 0;
                                            //数据长度
                                            len = new byte[2] { bytes[index + 22], bytes[index + 23] }.ReadUshort(ref xx).SwapUInt16();
                                        }
                                        if (bytes.Count > index + len + 24)
                                        {
                                            var bb = bytes.Skip(index).Take(24 + len + 1).ToArray();
                                            list.Add(bb);
                                            //初始化状态
                                            FindPackageHead = false;
                                            len = index = -1;

                                            //移除所有数据
                                            bytes.Clear();
                                        }
                                    }

                                }
                            }
                        }
                    }
                }

                else
                {
                    //Thread.Sleep(1);
                }
            }
            catch (Exception ex)
            {
                bytes.Clear();
                //初始化状态
                FindPackageHead = false;
                len = index = -1;

            }
            return list;
        }

    }
时间: 2024-10-24 09:38:09

DB11 TCP数据协议拆包接收主要方法的相关文章

TCP/IP协议族(一) HTTP简介、请求方法与响应状态码

接下来想系统的回顾一下TCP/IP协议族的相关东西,当然这些东西大部分是在大学的时候学过的,但是那句话,基础的东西还是要不时的回顾回顾的.接下来的几篇博客都是关于TCP/IP协议族的,本篇博客就先简单的聊一下TCP/IP协议族,然后聊一下HTTP协议,然后再聊一下SSL上的HTTP(也就是HTTPS)了.当然TCP/IP协议族是个老生常谈的话题,网络上关于该内容的文章一抓一大把呢,但是鉴于其重要性,还是有必要系统的总结一下的. 一.TCP/IP协议组简述 在聊HTTP与HTTPS之前呢,我们先简

Sweet Snippet系列 之 TCP数据接收

Sweet Snippet系列 之 TCP数据接收 一.引子 虽说仍然是Sweet Snippet,不过本篇并没有代码,纯粹是自己觉得有点趣味,就索性一记了~ 二. 问题 接触过网络编程的朋友大概都应知道TCP,作为一种"流"式协议,TCP的粘包问题一直都是程序处理的要点,而这次的问题就是,如果发送n字节的TCP数据,对端接收时会出现多少种接收情况? 三. 解法 我们先从具体的一个实例来简单算一算吧~就假设我们发送了3个字节的TCP数据: 由于TCP如果接收成功至少可以接收一个字节,所

TCP/IP 协议数据收发流程

先弄清楚重要的数据结构 两个全局的变量 struct socket* socket[NR_SOCKET];  struct proto_ops* pops[NR_PROTOCOL]; bsd socket 层 struct socket *sock  /  struct proto_ops *ops =========================== inet 层  struct proto_ops inet_proto_ops = { inet_creat, inet_read, ....

开机就提示“请安装TCP/IP协议,error=10106”的解决的方法

一.问题描写叙述: 今天开机时提示"请安装TCP/IP协议,error=10106",现象是popo,qq等登录不了,IE浏览器等连不了网,使用ping命令ping其它机器和路由器都能够收到返回的数据包,可是远程桌面连接不能正常使用. 二.解决方法: 上网搜索,得到答案,须要又一次安装TCP/IP协议,以下是copy下来并安装自己的又一次安装过程加以改动的步骤,仅供參考. 对于原创者以及转载者再次表示感谢! 重装TCP/IP协议后就OK! 过程例如以下:   1.删除这两个注冊表选项:

Linux2.6内核协议栈系列--TCP协议2.接收

1.排队机制 接收输入TCP报文时,有三个队列: ● 待处理队列 ● 预排队队列 ● 接收队列 接收队列包含了处理过的TCP数据段,也就是说,去除了全部的协议头,正准备将数据复制到用户应用程序.接收队列包含了所有按顺序接收的数据段,在其他两个队列中的TCP数据段则需要进一步处理. TCP报文首先由tcp_v4_rcv()进行处理.该函数要决定是否需要处理报文或者在待处理队列和预排队队列中排队. /* 传输层报文处理入口 */ int tcp_v4_rcv(struct sk_buff *skb)

C#读写三菱PLC数据 使用TCP/IP 协议

本文将使用一个Github开源的组件库技术来读写三菱PLC和西门子plc数据,使用的是基于以太网的TCP/IP实现,不需要额外的组件,读取操作只要放到后台线程就不会卡死线程,本组件支持超级方便的高性能读写操作 github地址:https://github.com/dathlin/HslCommunication 如果喜欢可以star或是fork,还可以打赏支持,打赏请认准源代码项目. 在Visual Studio 中的NuGet管理器中可以下载安装,也可以直接在NuGet控制台输入下面的指令安

TCP/IP协议数据包文件PCAP分析器

一.设计原理 1.PCAP文件构成 参考http://blog.csdn.net/gulu_gulu_jp/article/details/50494909 PCAP文件由一个PCAP文件头和多个PCAP数据包组成,PCAP数据又由数据包头和数据包内容组成.数据包内容才是我们将要进行分析还原的TCP/IP协议数据.PCAP总体结构如图 11所示: 图 11 PCAP文件总体结构 以TCP协议为例,详细解析PCAP文件格式.PCAP前24个字节为文件头,包含了文件信息,其结构如图 11所示.接着1

高效的TCP数据拆包器

高效的TCP数据拆包器 接收器,每秒拆1KB的包达到30万以上 /// 数据同步协义数据接收器 /// </summary> /// <remarks> /// 主要功能有 /// 1.将一个TCPSocket的所有数据全部接收 /// 2.解析协义 /// 3.解析完成后的协义调用 Handler通知外部处理 /// 4.定义一个协义解析线程不停的解析协义 /// </remarks> public class TCPReceiver : IDisposable {

Netty(三)TCP粘包拆包处理

tcp是一个“流”的协议,一个完整的包可能会被TCP拆分成多个包进行发送,也可能把小的封装成一个大的数据包发送,这就是所谓的TCP粘包和拆包问题. 粘包.拆包问题说明 假设客户端分别发送数据包D1和D2给服务端,由于服务端一次性读取到的字节数是不确定的,所以可能存在以下4种情况. 1.服务端分2次读取到了两个独立的包,分别是D1,D2,没有粘包和拆包: 2.服务端一次性接收了两个包,D1和D2粘在一起了,被成为TCP粘包; 3.服务端分2次读取到了两个数据包,第一次读取到了完整的D1和D2包的部