//筛选符合条件pcap文件 private void Button_Filter_Click(object sender, EventArgs e) { this.Cursor = Cursors.WaitCursor; Clear(); DateTime startData = startDate.Value.Date; // dateTimePickerStart.Value.Date;//开始日期 DateTime endData = endDate.Value.Date; //终止日期 DateTime _startTime = startData + new TimeSpan(startHour.Value.Hour, startHour.Value.Minute, startHour.Value.Second); //开始时间 DateTime _endTime = endData + new TimeSpan(endHour.Value.Hour, endHour.Value.Minute, endHour.Value.Second);; //终止时间 int frameID = 1; // 数据帧序号记录 FilterPcap filter = new FilterPcap(); //实例化一个根据文件时间筛选数据帧的类 List <string> fileNameList = filter.getReqrFileList(_startTime, _endTime, Application.StartupPath + "\\pcap"); //获得所有满足条件的文件的文件名 if (fileNameList.Count == 0) //不符合时间筛选条件的处理 { MessageBox.Show("没有找到指定的数据信息,请重新配置筛选条件!"); //时间查找不符合 this.Cursor = Cursors.Default; return; } else //符合时间筛选条件的处理 { //选取筛选的IP string sourIP = textBox1.Text; string destIP = textBox2.Text; string srcPort = textBox3.Text; string dstPort = textBox4.Text; DateTime preTime = new DateTime(), nowTime = new DateTime(); // 统计相邻两个数据帧时间间隔 // 符合文件的遍历 foreach (string filepath in fileNameList) { try { PacapReader reader = new PacapReader(filepath); List <PacapData> dataList = reader.Parse(); reader.Close(); #region for (int i = 0; i < dataList.Count; i++) { string[] frame = new string[11]; //列表行内容 frame[4] = dataList[i].Source.Address.ToString(); // 第五列 源IP地址 frame[6] = dataList[i].Dest.Address.ToString(); // 第七列 目的IP地址 int[] Ports = dataList[i].getPort(); frame[5] = Ports[0].ToString(); // 第六列 源端口号 frame[7] = Ports[1].ToString(); // 第八列 目的端口号 if ((frame[4] == sourIP) && (frame[6] == destIP) && frame[5] == srcPort && frame[7] == dstPort) //符合IP筛选条件的处理 { frame[0] = frameID.ToString(); //第一列 帧序号 DateTime dt = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1)).AddSeconds(dataList[i].PacketHeader.Ts.Timestamp_S).AddMilliseconds(dataList[i].PacketHeader.Ts.Timestamp_MS / 1000); frame[1] = dt.ToString("yyyy-MM-dd HH:mm:ss fff"); // 第二列 帧时间 // 时间间隔处理 if (frameID == 1) { preTime = dt; nowTime = dt; } else { preTime = nowTime; nowTime = dt; } if ((nowTime - preTime).TotalSeconds > 60) //两个不同文件的处理 { frame[2] = Convert.ToString(6); } else { frame[2] = (nowTime - preTime).TotalSeconds.ToString(); //第三列 时间间隔 } frame[3] = dataList[i].ProtocolType.ToString(); // 第四列 协议类型 frame[8] = dataList[i].Data.Length.ToString(); // 第九列 消息长度 frame[9] = dataList[i].Data.Length.ToString(); //foreach (int a in dataList[i].Data) //第十列 数据帧长度 //{ // string b = a.ToString("X2"); //数据帧内容转换为两位16进制大写 // frame[10] = frame[10] + b + " "; //第十一列 数据帧内容 //} //frame[10] = System.Text.Encoding.Default.GetString(dataList[i].Data); frameID++; //数据帧序号加1 Frame.Add(frame); } } #endregion } catch (Exception) { } } } if (Frame.Count == 0) //不符合IP筛选的处理 { MessageBox.Show("没有找到指定的数据信息,请重新配置筛选条件!"); this.Cursor = Cursors.Default; Frame.Clear(); //筛选出的数据集合清空,合理性待考虑 return; } else { plot = new Thread(Plot); plot.Start(); dtInfo = createDt(); labLoad.Text = "数据加载完成!"; Frame.Clear(); InitDataSet(); 一页.Enabled = true; 一页.Enabled = true; 关闭.Enabled = true; go.Enabled = true; lblPageCount.Enabled = true; } }
private void Button_Filter_Click(object sender, EventArgs e) { Clear(); DateTime startData = startDate.Value.Date; // dateTimePickerStart.Value.Date;//开始日期 DateTime endData = endDate.Value.Date; //终止日期 DateTime _startTime = startData + new TimeSpan(startHour.Value.Hour, startHour.Value.Minute, startHour.Value.Second); //开始时间 DateTime _endTime = endData + new TimeSpan(endHour.Value.Hour, endHour.Value.Minute, endHour.Value.Second);; //终止时间 int frameID = 1; // 数据帧序号记录 FilterPcap filter = new FilterPcap(); //实例化一个根据文件时间筛选数据帧的类 List <string> fileNameList = filter.getReqrFileList(_startTime, _endTime, Application.StartupPath + "\\CBTC"); //获得所有满足条件的文件的文件名 if (fileNameList.Count == 0) //不符合时间筛选条件的处理 { MessageBox.Show("没有找到指定的数据信息,请重新配置筛选条件!"); //时间查找不符合 } else //符合时间筛选条件的处理 { //选取筛选的IP string sourIP = textBox1.Text; string destIP = textBox2.Text; string srcPort = textBox3.Text; string dstPort = textBox4.Text; DateTime preTime = new DateTime(), nowTime = new DateTime(); // 统计相邻两个数据帧时间间隔 // 符合文件的遍历 foreach (string filepath in fileNameList) { try { int flag = 1; //当前文件流到达末尾标志 Boolean isNew = true; // 结束当前文件解析,读取下一个文件标志,每个PCAP文件只处理一次文件头 //FileStream fs = new FileStream(Application.StartupPath + "\\pcap\\" + filepath, FileMode.Open, FileAccess.Read, FileShare.Read); //创建流文件读取 FileStream fs = new FileStream(filepath, FileMode.Open, FileAccess.Read, FileShare.Read); //创建流文件读取 while (flag != 0) // 当前文件读取 { //PcapDecoder pcd = new PcapDecoder(Application.StartupPath + "\\pcap\\" + filepath); //实例化解析类 PcapDecoder pcd = new PcapDecoder(filepath); //实例化解析类 if (isNew) //判断是否是一个新的文件,新的pcap文件要先解析文件头 { pcd.GetFileHead(fs); //解析文件头 isNew = false; } pcd.GetDataHead(fs); //解析当前文件数据帧头部 if (pcd.isFinish == 0) //判断是否已经读取到文件末尾 { flag = 0; //达到末尾标志置0 } else { pcd.ReadPcapFile(fs); //解析数据帧 #region 将解析内容添加到列表显示 string[] frame = new string[11]; //列表行内容 frame[4] = pcd.PcapFile.IPHead.SourceIP; // 第五列 源IP地址 frame[6] = pcd.PcapFile.IPHead.DestIP; // 第七列 目的IP地址 frame[5] = pcd.PcapFile.UDPHead.SourcePort; // 第六列 源端口号 frame[7] = pcd.PcapFile.UDPHead.DestPort; // 第八列 目的端口号 //筛选Ip if ((frame[4] == sourIP) && (frame[6] == destIP) && frame[5] == srcPort && frame[7] == dstPort) //符合IP筛选条件的处理 { frame[0] = frameID.ToString(); //第一列 帧序号 frame[1] = pcd.PcapFile.DataHead.Time.ToString("yyyy-MM-dd HH:mm:ss fff"); // 第二列 帧时间 // 时间间隔处理 if (frameID == 1) { preTime = pcd.PcapFile.DataHead.Time; nowTime = pcd.PcapFile.DataHead.Time; } else { preTime = nowTime; nowTime = pcd.PcapFile.DataHead.Time; } if ((nowTime - preTime).TotalSeconds > 60) //两个不同文件的处理 { frame[2] = Convert.ToString(6); } else { frame[2] = (nowTime - preTime).TotalSeconds.ToString(); //第三列 时间间隔 } frame[3] = pcd.PcapFile.Protocol; // 第四列 协议类型 frame[4] = pcd.PcapFile.IPHead.SourceIP; // 第五列 源IP地址 //frame[5] = pcd.PcapFile.UDPHead.SourcePort; // 第六列 源端口号 frame[6] = pcd.PcapFile.IPHead.DestIP; // 第七列 目的IP地址 //frame[7] = pcd.PcapFile.UDPHead.DestPort; // 第八列 目的端口号 frame[8] = (pcd.PcapFile.DataHead.GetDataLength - 14).ToString(); // 第九列 消息长度 frame[9] = pcd.PcapFile.DataLength.ToString(); foreach (int a in pcd.PcapFile.Data) //第十列 数据帧长度 { string b = a.ToString("X2"); //数据帧内容转换为两位16进制大写 frame[10] = frame[10] + b + " "; //第十一列 数据帧内容 } //listView_Data.Items.Add(new ListViewItem(frame)); //添加列表 //listView_Data.Columns[10].Width = -1; //设置列表每一列的宽度根据内容自适应 //listView_Data.Columns[1].Width = -1; #endregion frameID++; //数据帧序号加1 Frame.Add(frame); //#region 统计画图 //this.Chart_Offline.Series[0].Points.AddY(Convert.ToDouble(frame[2])); //this.Chart_Offline.Series[0].ChartType = SeriesChartType.Line; //Chart_Offline.Series[0].BorderWidth = 3; //Chart_Offline.Series[0].Color = Color.Blue; //Update(); //#endregion } } // 当前数据帧解析结束 } //while循环结束 当前文件解析结束 } catch { //空执行,随后处理-------lishuai } } //foreach 符合文件遍历结束 if (Frame.Count == 0) //不符合IP筛选的处理 { MessageBox.Show("没有找到指定的数据信息,请重新配置筛选条件!"); Frame.Clear(); //筛选出的数据集合清空,合理性待考虑 } else { listView_Data.Update(); foreach (string[] s in Frame) { listView_Data.Items.Add(new ListViewItem(s)); } listView_Data.EndUpdate(); plot = new Thread(Plot); plot.Start(); //show = new Thread(Show); //////线程这一部分有问题,要再考虑 //show.Start(); } } //符合时间筛选结束 }