⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 unit3.~pas

📁 实现网络流量的生成,为cs结构,可以控制流量大小
💻 ~PAS
字号:
unit Unit3;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, BusinessSkinForm, StdCtrls, bsSkinCtrls, bsSkinBoxCtrls, Mask,
  ExtCtrls, TeEngine, Series, TeeProcs, Chart;
Const WM_Test=WM_User+100;
type
  Ttotal = class(TForm)
    bsBusinessSkinForm1: TbsBusinessSkinForm;
    Timer1: TTimer;
    bsSkinPanel1: TbsSkinPanel;
    bsSkinPanel3: TbsSkinPanel;
    bsSkinPanel2: TbsSkinPanel;
    Chart1: TChart;
    bsSkinStdLabel7: TbsSkinStdLabel;
    bsSkinStdLabel8: TbsSkinStdLabel;
    bsSkinEdit6: TbsSkinEdit;
    bsSkinStdLabel4: TbsSkinStdLabel;
    bsSkinStdLabel9: TbsSkinStdLabel;
    bsSkinEdit3: TbsSkinEdit;
    bsSkinPanel4: TbsSkinPanel;
    Chart2: TChart;
    bsSkinPanel5: TbsSkinPanel;
    bsSkinPanel6: TbsSkinPanel;
    bsSkinStdLabel3: TbsSkinStdLabel;
    bsSkinStdLabel5: TbsSkinStdLabel;
    bsSkinEdit4: TbsSkinEdit;
    bsSkinEdit1: TbsSkinEdit;
    bsSkinStdLabel6: TbsSkinStdLabel;
    bsSkinStdLabel11: TbsSkinStdLabel;
    bsSkinEdit5: TbsSkinEdit;
    bsSkinEdit7: TbsSkinEdit;
    bsSkinPanel7: TbsSkinPanel;
    bsSkinStdLabel1: TbsSkinStdLabel;
    bsSkinStdLabel10: TbsSkinStdLabel;
    bsSkinListBox1: TbsSkinListBox;
    bsSkinListBox4: TbsSkinListBox;
    bsSkinStdLabel13: TbsSkinStdLabel;
    bsSkinEdit9: TbsSkinEdit;
    bsSkinStdLabel14: TbsSkinStdLabel;
    bsSkinStdLabel15: TbsSkinStdLabel;
    bsSkinEdit10: TbsSkinEdit;
    bsSkinEdit11: TbsSkinEdit;
    bsSkinStdLabel16: TbsSkinStdLabel;
    bsSkinStdLabel18: TbsSkinStdLabel;
    bsSkinStdLabel19: TbsSkinStdLabel;
    bsSkinStdLabel20: TbsSkinStdLabel;
    bsSkinStdLabel21: TbsSkinStdLabel;
    bsSkinStdLabel22: TbsSkinStdLabel;
    bsSkinEdit8: TbsSkinEdit;
    bsSkinStdLabel23: TbsSkinStdLabel;
    Series1: TFastLineSeries;
    LineSeries1: TFastLineSeries;
    bsSkinStdLabel24: TbsSkinStdLabel;
    bsSkinStdLabel25: TbsSkinStdLabel;
    bsSkinStdLabel26: TbsSkinStdLabel;
    bsSkinStdLabel27: TbsSkinStdLabel;
    bsSkinStdLabel28: TbsSkinStdLabel;
    bsSkinStdLabel29: TbsSkinStdLabel;
    bsSkinEdit2: TbsSkinEdit;
    bsSkinMemo1: TbsSkinMemo;
    procedure Timer1Timer(Sender: TObject);
    function findindex(str:string):integer;
    procedure initialize(Sender:TObject);
  private
    { Private declarations }
    num:integer;
    pre_send_total:int64;
    pre_receive_total:int64;
    pre_flux:int64;
    total_delaytime:extended;
    total_count:integer;
    change_send_total:int64;
    change_receive_total:int64;
    sequence:integer;
    pre_sequence:integer;
  public
    { Public declarations }
    procedure WMtest(var Message: TMessage); message WM_test;
  end;

var
  total: Ttotal;

implementation
uses unit1;
    //function ReRecverInfo():boolean;Cdecl;external 'host.dll';
    function ReSenderInfo(senderIP:pchar):boolean;Cdecl;external 'host.dll';

{$R *.dfm}

//初始化本窗口total的过程
procedure Ttotal.initialize(Sender:TObject);
var  i:integer;
begin
     //载入发送主机地址列表
     if main.bsSkinListBox1.Items.Count>0 then
     begin
        self.bsSkinListBox1.Items.Clear;
        self.bsSkinListBox4.Items.Clear;
        for i:=5 to main.bsSkinListBox1.Items.Count-1 do
        begin
            self.bsSkinListBox1.Items.Add(main.bsSkinListBox1.Items.Strings[i]);
            self.bsSkinListBox4.Items.Add('0.000000');
        end;
     end;
     self.bsSkinEdit9.Text:=main.bsSkinListBox1.Items.Strings[0];
     self.bsSkinEdit10.Text:=main.bsSkinListBox1.Items.Strings[1];
     self.bsSkinEdit11.Text:=main.bsSkinListBox1.Items.Strings[2];

     self.bsSkinEdit1.Text:='0';
     self.bsSkinEdit4.Text:='0';
     self.bsSkinEdit5.Text:='';
     self.bsSkinEdit7.Text:='';
     self.bsSkinEdit6.Text:='0';
     self.bsSkinEdit3.Text:='0.681688';
     self.bsSkinEdit8.Text:='0';
     self.bsSkinEdit2.Text:='0';
     self.Series1.Clear;
     self.LineSeries1.Clear;
     self.num:=0;//横坐标清0
     self.pre_receive_total:=0;
     self.pre_send_total:=0;
     self.change_receive_total:=0;
     self.change_send_total:=0;
     self.pre_flux:=0;
     self.total_delaytime:=0;
     self.total_count:=0;
     self.sequence:=0;
     self.pre_sequence:=0;
end;

//发送统计请求,用timer1来控制统计速率
procedure Ttotal.Timer1Timer(Sender: TObject);
var  i:integer;
     lost_per:extended;
     str:string;
     pos:integer;
     min:extended;
     max:extended;
     average_del:extended;
     send_total:int64;
     receive_total:int64;
     flux:int64;
begin
     //发送请求
     for i:=0 to self.bsSkinListBox1.Items.Count-1 do
     ReSenderInfo(pchar(self.bsSkinListBox1.Items.Strings[i]));
     //ReRecverInfo(pchar(self.bsSkinListBox1.Items.Strings[1]));
     //ReRecverInfo();

     {
     //读取接收数量、发送数量等数据
     send_total:=strtoint64(self.bsSkinEdit4.Text);
     receive_total:=strtoint64(self.bsSkinEdit1.Text);
     //send_total:=1000;
     //receive_total:=1000;

     //调试
     self.bsSkinMemo1.Lines.Add(inttostr(send_total)+'**'+inttostr(self.pre_send_total)+'**'+inttostr(receive_total)+'**'+inttostr(pre_receive_total)+'**'+inttostr(change_send_total)+'**'+inttostr(change_receive_total));

     //处理一些特殊情况,如信息未收到或者信息迟到
     if (send_total<=self.pre_send_total) then
     begin
         receive_total:=receive_total+change_receive_total;
         send_total:=send_total+change_send_total;
         self.bsSkinEdit4.Text:=inttostr(send_total);
         self.bsSkinEdit1.Text:=inttostr(receive_total);
         self.bsSkinEdit8.Text:=inttostr(strtoint64(self.bsSkinEdit4.Text)*(strtoint(self.bsSkinEdit9.Text)+42) div 1024);
     end;

     //显示总丢包率
     if send_total<>0 then
     begin
        lost_per:=1-(receive_total/send_total);
        //屏蔽掉丢包率为负值的情况,出现这种情况还是显示以前的值
        if (lost_per>=0) and (lost_per<=1) then
           str:= floattostr(lost_per*100)
        else
           str:= self.bsSkinEdit5.Text;

        pos:=AnsiPos('.',str);
        if (pos>0) and (length(str)> pos+6) then
           str:=copy(str,1,pos+6);//取小数点后6位

        //显示总丢包率
        self.bsSkinEdit5.Text:=str;
     end;

     //显示实时丢包率
     if (send_total-pre_send_total)<>0 then
     begin
        lost_per:=1-((receive_total-pre_receive_total)/(send_total-pre_send_total));
        if (lost_per >= 0) and (lost_per <= 1) then
           str:= floattostr(lost_per*100)
        else
           str:=self.bsSkinEdit6.Text;
     end
     else
        str:=self.bsSkinEdit6.Text;
     self.bsSkinEdit6.Text:=str;

     flux:=strtoint64(self.bsSkinEdit8.Text);
     //调试
     self.bsSkinMemo1.Lines.Add(inttostr(sequence)+'**'+inttostr(flux)+'**'+inttostr(pre_flux));
     //self.bsSkinMemo1.Lines.Add(inttostr(sequence+pre_sequence)+'**'+inttostr(flux)+'**'+inttostr(pre_flux));
     //显示流量
     if (flux-pre_flux>0) then
     begin
        //消息正常接收
        if sequence-pre_sequence>0 then
        begin
           self.bsSkinEdit2.Text:=inttostr((((flux-pre_flux)*1000*8) div self.Timer1.interval) div (sequence-pre_sequence));
           pre_sequence:=sequence;
        end;
        pre_flux:=flux;
     end;
     {else
     begin
        //消息因故晚到:保持bsskinedit2.text不变,同时按照上次的流量值bsskinedit2.text更新pre_flux
        pre_flux:=flux+(strtoint64(self.bsSkinEdit2.Text)*self.Timer1.Interval div 8000);
     end;}

     //显示累积网络时延,total_count为0时不统计
     if self.total_count>0 then
     begin
        average_del:=0;
        for i:=0 to self.bsSkinListBox4.Items.Count-1 do
            average_del:=average_del+strtofloat(self.bsSkinListBox4.Items.Strings[i]);
        average_del:=average_del/self.bsSkinListBox4.Items.Count;
        //average_del:=(average_del+self.total_delaytime*self.total_count)/(self.total_count+1);
        //归整时延数据
        str:= floattostr(average_del);
        pos:=AnsiPos('.',str);
        if (pos>0) and (length(str)> pos+6) then
           str:=copy(str,1,pos+6);//取小数点后6位
        self.bsSkinEdit7.Text:=str;
     end;

     //更新一些变量
     total_count:=self.total_count+1;
     total_delaytime:=average_del;
     change_receive_total:=receive_total-pre_receive_total;
     change_send_total:=send_total-self.pre_send_total;
     pre_receive_total:=receive_total;
     self.pre_send_total:=send_total;

     //画曲线
     if num > Chart1.BottomAxis.Maximum then
     begin
        min:= Chart1.BottomAxis.Minimum+1;
        max:= Chart1.BottomAxis.Maximum+1;
        Chart1.BottomAxis.SetMinMax(min,max);
        min:= Chart2.BottomAxis.Minimum+1;
        max:= Chart2.BottomAxis.Maximum+1;
        Chart2.BottomAxis.SetMinMax(min,max);
     end;
     self.Series1.AddXY(num,strtofloat(self.bsSkinEdit6.Text));
     self.LineSeries1.AddXY(num,strtofloat(self.bsSkinEdit3.Text));
     num:=num+1;
end;

procedure Ttotal.WMtest(var Message: TMessage);
var  pos:integer;
     pos1:integer;
     listboxindex:integer;
     mes3:string;
     mes1:string;
     mes2:string;
     str:string;
     str1:string;
     str2:string;
     str3:string;
     str4:string;
     i:integer;
     total_num:integer;
     average_del:extended;
begin
     //传过来的是一个字符串的头指针
     mes1:=pchar(Message.WParam);//存放WParam
     mes3:=pchar(Message.LParam);//读取序号或时延
     self.bsSkinMemo1.Lines.Add('【'+mes3+'】***'+mes1+'***');

     if mes1<>'' then
     begin
        pos:=AnsiPos('*',mes1);
        if pos=0  then
        begin
           //不含"*",说明是发送端数据,mes1是发送端地址,mes2是时延+流量+序号
           listboxindex:=self.findindex(mes1);
           if listboxindex>-1 then
           begin
              //统计当前平均时延
              mes2:=pchar(Message.LParam);
              pos1:=AnsiPos('*',mes2);
              str1:=copy(mes2,1,pos1-1);   //流量
              str2:=copy(mes2,pos1+1,length(mes2)-pos1); //时延+丢包率
              pos1:=AnsiPos('*',str2);
              str3:=copy(str2,1,pos1-1);   //时延
              str4:=copy(str2,pos1+1,length(str2)-pos1); //丢包率

              str1:=copy(str1,1,length(str1)-6)+'.'+copy(str1,length(str1)-5,6);
              self.bsSkinEdit2.Text:=str1;  //流量
              self.bsSkinListBox4.Items.Strings[listboxindex]:=copy(str3,1,length(str3)-6)+'.'+copy(str3,length(str3)-5,6);
              str4:=copy(str4,1,length(str4)-4)+'.'+copy(str4,length(str4)-3,4);
              self.bsSkinEdit5.Text:=str4;  //丢包率
              self.bsSkinEdit6.Text:=str4;
              average_del:=0;
              for i:=0 to self.bsSkinListBox4.Items.Count-1 do
                  average_del:=average_del+strtofloat(self.bsSkinListBox4.Items.Strings[i]);
              average_del:=average_del/self.bsSkinListBox4.Items.Count;
              //归整时延数据
              str:= floattostr(average_del);
              pos:=AnsiPos('.',str);
              if (pos>0) and (length(str)> pos+6) then
                 str:=copy(str,1,pos+6);//取小数点后6位

              self.bsSkinEdit3.Text:=str;
           end;
        end
        else
        begin
           //含"*" 说明是接收端数据,mes1存放的是发送数量和接收数量,中间用*隔开
           pos:=AnsiPos('*',mes1);
           //sequence:=strtoint(mes3);
           self.bsSkinEdit4.Text:=copy(mes1,1,pos-1);
           self.bsSkinEdit1.Text:=copy(mes1,pos+1,length(mes1)-pos);
           //self.bsSkinEdit8.Text:=inttostr(strtoint64(self.bsSkinEdit4.Text)*(strtoint(self.bsSkinEdit9.Text)+42) div 1024);
        end;
     end;

end;

function Ttotal.findindex(str:string):integer;
var  i:integer;
begin
     i:=0;
     while i<self.bsSkinListBox1.Items.Count do
     begin
        if self.bsSkinListBox1.Items.Strings[i]=str then
        begin
           result:=i;
           i:=self.bsSkinListBox1.Items.Count+1;
        end
        else
           i:=i+1;
     end;
     if i=self.bsSkinListBox1.Items.Count then
        result:=-1;
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -