/// <summary> /// 添加数据包到列表 /// </summary> /// <param name="packet">数据包</param> private void AddPacketToList(FileDataThransmitPacket packet) { listPacket.Add(packet); addCount = (UInt32)(addCount + packet.FileData.Length); if (addCount > mAttribute.Size) { overFlag = true; } if (packet.Fllow == FllowingFlag.Nothing) { fullFlag = true; } }
/// <summary> /// 添加数据包--用于接收数据 /// </summary> /// <param name="packet">校验后的数据包</param> /// <returns>FileTransmitDescription 代码</returns> public FileTransmitDescription AddPacketData(FileDataThransmitPacket packet) { try { if (fullFlag) { return(FileTransmitDescription.UnknowError); } if (!packet.CheckSame()) { return(FileTransmitDescription.CheckError); } if (mAttribute.ID != packet.FileID)//检测ID是否一致 { return(FileTransmitDescription.DifferentID); } if (CurrentPacket != null) { if (CurrentPacket.NextFragmentNum != packet.FragmentNum)//检测段号是否连续 { return(FileTransmitDescription.DifferentFileLen); } if (CurrentPacket.Fllow != FllowingFlag.Exist) //检测上次是否已满 { return(FileTransmitDescription.UnknowError); } else { AddPacketToList(packet); return(FileTransmitDescription.Success); } } else { AddPacketToList(packet); return(FileTransmitDescription.Success); } } catch (Exception ex) { throw ex; } }
/// <summary> /// 文件包初始化--每次文件传输最大按200字节计算 /// </summary> /// <param name="attribute">文件属性</param> /// <param name="fileData">文件数据</param> public FilePacketManager(FileAttribute attribute, byte[] fileData) : this(attribute) { try { if (fileData.Length == 0) { throw new ArgumentException("打包数据长度不能为0"); } int max = 200; int count = fileData.Length / max; int remain = fileData.Length % max; for (int i = 0; i < count; i++) { UInt32 frage = (UInt32)(i * max); var packet = new FileDataThransmitPacket(OperatSign.WriteFileThransmit, mAttribute.ID, frage, FllowingFlag.Exist, fileData, (int)frage, max); listPacket.Add(packet); addCount = (UInt32)(addCount + max); } if (remain != 0) { UInt32 frage = (UInt32)(count * max); var packet = new FileDataThransmitPacket(OperatSign.WriteFileThransmit, mAttribute.ID, frage, FllowingFlag.Nothing, fileData, (int)frage, remain); addCount = (UInt32)(addCount + remain); } else { CurrentPacket.Fllow = FllowingFlag.Nothing; } fullFlag = true; } catch (Exception ex) { throw ex; } }
/// <summary> /// 文件服务--写文件数据传输 /// </summary> /// <param name="transmitSeqNum">发送序列号</param> /// <param name="receiveSeqNum">接收序列号</param> /// <param name="cot">传输原因</param> /// <param name="ASDUPublicAddress">ASDU公共地址</param> /// <param name="transmitDataPacket">传输包数据</param> public FileWritePacket(UInt16 transmitSeqNum, UInt16 receiveSeqNum, CauseOfTransmissionList cot, UInt16 ASDUPublicAddress, FileDataThransmitPacket transmitDataPacket) : base(transmitSeqNum, receiveSeqNum, cot, ASDUPublicAddress, transmitDataPacket.GetPacketData()) { }