www.pudn.com > CaptureIP.rar > cap_main.pas


unit cap_main; 
 
interface 
 
uses 
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, 
  cap_ip, StdCtrls, ExtCtrls, Grids, ComCtrls, Buttons, Menus; 
 
type 
  Tmy_data=record 
    buf:array of char; 
end; 
 
type 
  TForm1 = class(TForm) 
    BitBtn1: TBitBtn; 
    BitBtn2: TBitBtn; 
    BitBtn3: TBitBtn; 
    BitBtn4: TBitBtn; 
    PageControl1: TPageControl; 
    TabSheet1: TTabSheet; 
    TabSheet2: TTabSheet; 
    StringGrid1: TStringGrid; 
    Splitter1: TSplitter; 
    Edit2: TEdit; 
    Label1: TLabel; 
    Panel1: TPanel; 
    Memo1: TMemo; 
    Splitter2: TSplitter; 
    Memo2: TMemo; 
    BitBtn5: TBitBtn; 
    Label2: TLabel; 
    Edit1: TEdit; 
    ComboBox1: TComboBox; 
    Label7: TLabel; 
    ComboBox2: TComboBox; 
    Label8: TLabel; 
    BitBtn6: TBitBtn; 
    procedure FormCreate(Sender: TObject); 
    procedure cap_ip1Cap(ip, proto, sourceIP, destIP, SourcePort, 
      DestPort: String; header: PChar; header_size: Integer; data: PChar; 
      data_size: Integer); 
    procedure BitBtn1Click(Sender: TObject); 
    procedure BitBtn2Click(Sender: TObject); 
    procedure BitBtn3Click(Sender: TObject); 
    procedure StringGrid1Click(Sender: TObject); 
    procedure BitBtn5Click(Sender: TObject); 
    procedure BitBtn6Click(Sender: TObject); 
    procedure BitBtn4Click(Sender: TObject); 
    procedure FormClose(Sender: TObject; var Action: TCloseAction); 
  private 
    { Private declarations } 
  public 
    function check_filter(proto, sourceIP, destIP, SourcePort,DestPort: String;data: PChar;data_size: Integer):boolean; 
  end; 
 
var 
  Form1: TForm1; 
  buf_list:array of Tmy_data; 
  filter_str:string; 
  cap_ip1:Tcap_ip; 
implementation 
 
{$R *.DFM} 
 
procedure TForm1.FormCreate(Sender: TObject); 
begin 
  with StringGrid1.Rows[0] do 
   begin 
    Add('协议类型'); 
    Add('源地址'); 
    Add('源端口'); 
    Add('目的地址'); 
    Add('目的端口'); 
    Add('数据大小'); 
    Add('数据内容'); 
   end; 
  setlength(buf_list,strtoint(edit2.text)); 
  cap_ip1:=Tcap_ip.Create(self); 
  cap_ip1.OnCap:=cap_ip1Cap; 
end; 
 
function TForm1.check_filter(proto, sourceIP, destIP, SourcePort,DestPort: String;data: PChar;data_size: Integer):boolean; 
var 
    i:integer; 
    temp_str:string; 
begin 
 result:=true; 
 if filter_str='' then 
  begin 
   result:=false; 
   exit; 
  end; 
 if (filter_str='排除协议'+proto) then exit; 
 if (filter_str='排除源地址'+sourceIP) then exit; 
 if (filter_str='排除源端口'+SourcePort) then exit; 
 if (filter_str='排除目的地址'+destIP) then exit; 
 if (filter_str='排除目的端口'+DestPort) then exit; 
 
 if (ComboBox2.text='包含') and (ComboBox1.Text<>'内容') then 
   begin 
     if (filter_str='包含协议'+proto) then begin result:=false;exit;end; 
     if (filter_str='包含源地址'+sourceIP) then begin result:=false;exit;end; 
     if (filter_str='包含源端口'+SourcePort) then begin result:=false;exit;end; 
     if (filter_str='包含目的地址'+destIP) then begin result:=false;exit;end; 
     if (filter_str='包含目的端口'+DestPort) then begin result:=false;exit;end; 
     result:=true;exit; 
   end; 
 
 if (filter_str<>'包含内容') then 
   begin 
    result:=false;exit; 
   end; 
  setlength(buf_list[StringGrid1.RowCount-2].buf,data_size); 
  copymemory(buf_list[StringGrid1.RowCount-2].buf,data,data_size); 
  temp_str:=''; 
  for i:=0 to data_size-1 do 
    temp_str:=temp_str+buf_list[StringGrid1.RowCount-2].buf[i]; 
    temp_str:=AnsiLowerCase(temp_str); 
 
  if (filter_str='包含内容') then 
    begin 
     if pos(AnsiLowerCase(edit1.text),temp_str)>0 then 
      begin 
       result:=false; exit; 
      end else 
      begin 
       result:=true; exit; 
      end; 
    end else 
   if (filter_str='排除内容') then 
     begin 
      if pos(AnsiLowerCase(edit1.text),temp_str)>0 then 
       begin 
        result:=true; exit; 
       end else 
       begin 
        result:=false; exit; 
       end; 
    end; 
 result:=false; 
end; 
 
procedure TForm1.cap_ip1Cap(ip, proto, sourceIP, destIP, SourcePort, 
  DestPort: String; header: PChar; header_size: Integer; data: PChar; 
  data_size: Integer); 
begin 
 if check_filter(proto,sourceIP, destIP, SourcePort,DestPort, data,data_size) then exit; 
  with StringGrid1 do 
   begin 
    Cells[0,StringGrid1.RowCount-1]:=proto; 
    Cells[1,StringGrid1.RowCount-1]:=sourceIP; 
    Cells[2,StringGrid1.RowCount-1]:=SourcePort; 
    Cells[3,StringGrid1.RowCount-1]:=destIP; 
    Cells[4,StringGrid1.RowCount-1]:=DestPort; 
    Cells[5,StringGrid1.RowCount-1]:=inttostr(data_size); 
    Cells[6,StringGrid1.RowCount-1]:=data; 
   end; 
   setlength(buf_list[StringGrid1.RowCount-2].buf,data_size); 
   copymemory(buf_list[StringGrid1.RowCount-2].buf,data,data_size); 
 if (StringGrid1.RowCount>strtoint(edit2.text)) then 
    StringGrid1.RowCount:=2 
   else 
   begin 
    StringGrid1.RowCount:=StringGrid1.RowCount+1; 
    StringGrid1.Rows[StringGrid1.RowCount].Clear; 
   end; 
 
 stringgrid1.toprow:=StringGrid1.RowCount- StringGrid1.VisibleRowCount; 
end; 
 
procedure TForm1.BitBtn1Click(Sender: TObject); 
begin 
  cap_ip1.StartCap; 
end; 
 
procedure TForm1.BitBtn2Click(Sender: TObject); 
begin 
 cap_ip1.pause; 
 if cap_ip1.Fpause then 
  BitBtn2.Caption:='继续捕捉' 
  else 
  BitBtn2.Caption:='暂停捕捉'; 
end; 
 
procedure TForm1.BitBtn3Click(Sender: TObject); 
begin 
cap_ip1.StopCap; 
end; 
 
procedure TForm1.StringGrid1Click(Sender: TObject); 
var text_str,hex_str,all_str:string; 
    i:integer; 
    no: Integer; 
begin 
  memo1.lines.Clear; 
  memo2.lines.Clear; 
  text_str:='';hex_str:='';all_str:=''; 
  i:=0; 
  while i<= high(buf_list[stringgrid1.Selection.Top-1].buf) do 
   begin 
     no:=ord(buf_list[stringgrid1.Selection.Top-1].buf[i]); 
     hex_str:=hex_str+format('%0.2x',[no])+' '; 
     if no<20 then 
      begin 
        text_str:=text_str+'.'; 
        all_str:=all_str+'.'; 
      end else 
      begin 
        text_str:=text_str+buf_list[stringgrid1.Selection.Top-1].buf[i]; 
        all_str:=all_str+buf_list[stringgrid1.Selection.Top-1].buf[i]; 
      end; 
 
     if ((i mod 8)=7) then 
      begin 
       memo1.lines.add(hex_str+'  |  '+text_str); 
       text_str:='';hex_str:=''; 
      end; 
     inc(i); 
   end; 
 if hex_str<>'' then 
   memo1.lines.add(hex_str+format('%'+inttostr(24-length(hex_str))+'s',[' '])+'  |  '+text_str); 
 
  memo2.lines.Add(all_str); 
end; 
 
 
procedure TForm1.BitBtn5Click(Sender: TObject); 
begin 
 StringGrid1.RowCount:=2; 
 StringGrid1.Rows[1].Clear; 
end; 
 
procedure TForm1.BitBtn6Click(Sender: TObject); 
begin 
 filter_str:=''; 
 if (ComboBox2.text='') or (ComboBox1.Text='') or (edit1.Text='') then 
   showmessage('内容不全!') else 
  if  ComboBox1.Text='内容' then 
    filter_str:=self.ComboBox2.text+self.ComboBox1.Text 
   else 
     filter_str:=self.ComboBox2.text+self.ComboBox1.Text+AnsiUpperCase(edit1.Text); 
 
end; 
 
procedure TForm1.BitBtn4Click(Sender: TObject); 
begin 
  close; 
end; 
 
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); 
begin 
  cap_ip1.Free; 
end; 
 
end.