/// <summary> /// 找到包头标志后,对数据进行处理 /// </summary> /// <param name="nAlreadyRecCount">接收的数据长度</param> /// <param name="nDataPointer">第几个字节开始为包头位置</param> private void FindPackHead(int nAlreadyRecCount, int nDataPointer) { // 找到一个数据报头信息 // 网络包长度小于包头时不是一个完整的包 if (nAlreadyRecCount - nDataPointer < PacketHeadSize) { return; } PackHead m_PackHead = new PackHead(); SetPackHead(nDataPointer, ref m_PackHead); // 判断获得的数据除去表头 是否大于数据长度 if (nAlreadyRecCount - nDataPointer - PacketHeadSize < m_PackHead.DataLength) { return; } //完整的包数据 byte[] m_ComData = new byte[PacketHeadSize + m_PackHead.DataLength]; Array.Copy(m_TmpData, nDataPointer, m_ComData, 0, PacketHeadSize + m_PackHead.DataLength); PackData pd = new PackData(); pd.m_Index = m_lstPackData.Count; pd.m_Head = m_PackHead; pd.m_ByteData = m_ComData.ToList(); lock (m_lock) { nNetPos += PacketHeadSize + pd.m_Head.DataLength; m_lstPackData.Add(pd); } }
/// <summary> /// 设置包头 /// </summary> private void SetPackHead(int nDataPointer, ref PackHead m_PackHead) { m_PackHead.Reset(); m_PackHead.m_Signature[0] = m_TmpData[nDataPointer]; m_PackHead.m_Signature[1] = m_TmpData[nDataPointer + 1]; m_PackHead.m_Signature[2] = m_TmpData[nDataPointer + 2]; m_PackHead.m_Signature[3] = m_TmpData[nDataPointer + 3]; m_PackHead.m_Command[0] = m_TmpData[nDataPointer + 4]; m_PackHead.m_Command[1] = m_TmpData[nDataPointer + 5]; m_PackHead.m_Command[2] = m_TmpData[nDataPointer + 6]; m_PackHead.m_Command[3] = m_TmpData[nDataPointer + 7]; m_PackHead.m_Length[0] = m_TmpData[nDataPointer + 8]; m_PackHead.m_Length[1] = m_TmpData[nDataPointer + 9]; m_PackHead.m_Length[2] = m_TmpData[nDataPointer + 10]; m_PackHead.m_Length[3] = m_TmpData[nDataPointer + 11]; m_PackHead.DataLength = BitConverter.ToInt32(m_PackHead.m_Length, 0); m_PackHead.DataCommand = BitConverter.ToInt32(m_PackHead.m_Command, 0); }