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

📄 unit1.pas

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

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Mask, ExtCtrls,Menus,TeeProcs, TeEngine, Chart, ToolWin, ActnMan, ActnCtrls, ComCtrls, jpeg,
  bsSkinData, BusinessSkinForm, bsSkinCtrls, bsSkinBoxCtrls, bsMessages,
  Series;

Const
     WM_Test=WM_User+100;  //消息号
type
  Tmain = class(TForm)
    bsStoredSkin1: TbsStoredSkin;
    bsSkinData1: TbsSkinData;
    bsBusinessSkinForm1: TbsBusinessSkinForm;
    bsSkinMainMenu1: TbsSkinMainMenu;
    kk1: TMenuItem;
    N1: TMenuItem;
    N2: TMenuItem;
    N3: TMenuItem;
    N4: TMenuItem;
    N5: TMenuItem;
    N7: TMenuItem;
    N8: TMenuItem;
    N9: TMenuItem;
    bsSkinMainMenuBar1: TbsSkinMainMenuBar;
    N10: TMenuItem;
    bsSkinMessage1: TbsSkinMessage;
    bsStoredSkin2: TbsStoredSkin;
    bsSkinData2: TbsSkinData;
    Timer2: TTimer;
    bsSkinListBox1: TbsSkinListBox;
    bsSkinPanel1: TbsSkinPanel;
    bsSkinMemo1: TbsSkinMemo;
    Timer1: TTimer;
    procedure N1Click(Sender: TObject);
    procedure N4Click(Sender: TObject);
    procedure N10Click(Sender: TObject);
    procedure N2Click(Sender: TObject);
    procedure N3Click(Sender: TObject);
    procedure Timer2Timer(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure N8Click(Sender: TObject);
    procedure N9Click(Sender: TObject);

  private
    { Private declarations }
  public
    procedure WMtest(var Message: TMessage); message WM_test;
  end;

var
  main: Tmain;
  message_count1:integer;
  num1:integer;
  num2:integer;

implementation
uses unit3,unit7;
    function StartRun():boolean;Cdecl;external 'host.dll';
    function StartSendandRecv(senderIp:pchar;recverIp:pchar;pktLen:integer;sleepTime:integer):boolean;Cdecl;external 'host.dll';
    //function ReRecverInfo():boolean;Cdecl;external 'host.dll';
    function ReSenderInfo(senderIp:pchar):boolean;Cdecl;external 'host.dll';
    function StopSend(senderIp:pchar):boolean;Cdecl;external 'host.dll';
    function StopRecv():boolean;Cdecl;external 'host.dll';
    procedure GiveWndHandle(hwnd1:HWND;hwnd2:HWND);Cdecl;external 'host.dll';
{$R *.dfm}

//菜单--设置
procedure Tmain.N1Click(Sender: TObject);
begin
     para_set.Show;
end;

//菜单--退出
procedure Tmain.N4Click(Sender: TObject);
begin
     application.Terminate;
end;

//菜单--结果统计
procedure Tmain.N10Click(Sender: TObject);
begin
     total.Show;
end;

//菜单--开始发送
procedure Tmain.N2Click(Sender: TObject);
var  input:textfile;
     str:string;
     i:integer;
     total_interval:integer;
begin
     //将参数从mysettings.ini载入main.bsSkinListBox1
     //如果文件存在则读取数据
     if fileexists('mysettings.ini') then
     begin
        assignfile(input,'mysettings.ini');
        reset(input);
        //将发送数据包大小、接收端主机地址、接收端主机端口、发送速率、统计速率、发送端主机地址依次载入main.bsSkinListBox1
        self.bsSkinListBox1.Items.Clear;
        readln(input,str);
        while (str<>'END') do
        begin
           self.bsSkinListBox1.Items.Add(str);
           readln(input,str);
        end;
        closefile(input);
     end
     else
     self.bsSkinMessage1.MessageDlg('文件不存在!',mtcustom,[mbyes],0);

     //total接收统计数据的消息,main接收控制消息
     GiveWndHandle(total.Handle,self.Handle);
     if StartRun() then
     begin
        self.bsSkinMemo1.Lines.Add('控制端初始化成功!');
     end;

     for i:=5 to self.bsSkinListBox1.Items.Count-1 do
         StartSendandRecv(pchar(self.bsSkinListBox1.Items.Strings[i]),pchar(self.bsSkinListBox1.Items.Strings[1]),strtoint(self.bsSkinListBox1.Items.Strings[0]),strtoint(self.bsSkinListBox1.Items.Strings[3]));

     self.bsSkinMemo1.Lines.Add('发送端已经开始发送!');
     self.bsSkinMemo1.Lines.Add('接收端已经开始接收!');

     //只有开始发送之后才能点击统计结果按钮和停止发送按钮
     self.N3.Enabled:=true;
     self.N10.Enabled:=true;
     total.Show;
     total.initialize(sender);

     //原来的开始统计按钮所做的事情
     total_interval:=strtoint(self.bsSkinListBox1.Items.Strings[4]);
     total.bsSkinStdLabel26.Caption:='横坐标单位:'+inttostr(total_interval)+'毫秒       ';
     total.bsSkinStdLabel27.Caption:=total.bsSkinStdLabel26.Caption;
     total.Timer1.Interval:=total_interval;
     total.Timer1.Enabled:=true;

     total.Chart1.BottomAxis.SetMinMax(0,25);
     total.Chart2.BottomAxis.SetMinMax(0,25);
     self.bsSkinMemo1.Lines.Add('请在菜单中选择结果统计,查看流量的统计结果!');

     //开始发送之后本按钮就不能点击,同时也不能点击设置按钮
     self.N1.Enabled:=false;
     self.N2.Enabled:=false;
end;

//菜单--停止发送
procedure Tmain.N3Click(Sender: TObject);
var  i:integer;
begin
     total.Timer1.Enabled:=false;
     total.Chart1.BottomAxis.SetMinMax(0,25);
     total.Chart2.BottomAxis.SetMinMax(0,25);
     total.initialize(sender);

     //发送端停止发送
     for i:=5 to self.bsSkinListBox1.Items.Count-1 do
     begin
        StopSend(pchar(self.bsSkinListBox1.Items.Strings[i]));
     end;

     self.bsSkinMemo1.Lines.Add('发送端正在停止发送!');
     self.bsSkinMemo1.Lines.Add('接收端正在停止接收!');

     //用来记录停止发送端时返回的消息的个数
     message_count1:=0;

     //控制接收端停止接收的timer,num用来计数,超时显示异常发生
     self.Timer2.Enabled:=true;
     num1:=0;

     //控制发送端停止发送的timer
     self.Timer1.Enabled:=true;
     num2:=0;

end;

//收到消息后触发的事件
procedure Tmain.WMtest(var Message: TMessage);
var  str:string;
     i:integer;
begin
     //传过来的是一个字符串的头指针
     str:=pchar(Message.WParam);
     i:=self.bsSkinListBox1.Items.Count-5;

     //当收到发送端发的消息的时候,应该做的事情
     if str='sender stopped!' then
     begin
        message_count1:=message_count1+1;
        //如果所有的发送端都停止
        if message_count1 >= i then
        begin
           self.Timer1.Enabled:=false;
           self.bsSkinMemo1.Lines.Add('所有的发送端都已经停止发送!');
        end
        else
           self.bsSkinMemo1.Lines.Add('还有'+inttostr(i-message_count1)+'个发送端尚未停止!');
     end
     else if str='recver stopped!' then
     begin
        self.Timer2.Enabled:=false;
        self.bsSkinMemo1.Lines.Add('接收端已经停止接收!');
        total.Hide;
        self.N3.Enabled:=false;
        self.N10.Enabled:=false;
        self.N1.Enabled:=true;
     end
     else
     begin
        self.bsSkinMemo1.Lines.Add(str+'已经开始发送!')
     end;

end;

//timer2用来使接收端停止接收
procedure Tmain.Timer2Timer(Sender: TObject);
begin
     num1:=num1+1;
     StopRecv();  
     if num1>100 then
     begin
        self.bsSkinMemo1.Lines.Add('停止接收端时发生错误,超时退出!');
        total.Hide;
        self.N3.Enabled:=false;
        self.N10.Enabled:=false;
        self.N1.Enabled:=true;
        self.Timer2.Enabled:=false;
     end;
end;

//窗体大小初始化
procedure Tmain.FormCreate(Sender: TObject);
begin
     self.bsBusinessSkinForm1.WindowState:= wsMaximized;
     self.bsSkinPanel1.Width:=1024;
     self.bsSkinPanel1.Height:=738;
     self.bsSkinMemo1.Width:=1000;
     self.bsSkinMemo1.Height:=670;
end;

//timer1用来控制使所有的发送端停止发送
procedure Tmain.Timer1Timer(Sender: TObject);
var  i:integer;
begin
     num2:=num2+1;
     if (num2<=200) and (message_count1<self.bsSkinListBox1.Items.Count) then
        for i:=5 to self.bsSkinListBox1.Items.Count-1 do
            StopSend(pchar(self.bsSkinListBox1.Items.Strings[i]));

     if (num2>200) and (message_count1<self.bsSkinListBox1.Items.Count) then
     begin
        self.bsSkinMemo1.Lines.Add('停止发送端时发生错误,超时退出!');
        self.Timer1.Enabled:=false;
     end;
end;

procedure Tmain.N8Click(Sender: TObject);
begin
     self.bsSkinMessage1.MessageDlg('分布式网络流量生成及测量工具主控端 v2.0',mtcustom,[mbyes],0);
end;

procedure Tmain.N9Click(Sender: TObject);
begin
     self.bsSkinMessage1.MessageDlg('项目策划:刘轶导师 程序设计:崔华力,田敏 技术支持信箱:huali_chl@163.com',mtcustom,[mbyes],0);
end;

end.

⌨️ 快捷键说明

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