各位朋友,代码如下,如果修改这个过程,才能实时统计出SOURCEIP每秒的流量呢?而且必须该流量要转化成以KB为单位,希望能朋友能赐教,谢谢!
procedure TForm1.cap_ip1Cap(ip, proto, sourceIP, destIP, SourcePort,
  DestPort: string; header: PChar; header_size: Integer; data: PChar;
  data_size: Integer);
begin
  if not ((ip = sourceIP) or (ip = destIP)) then // 仅本机
    begin
      exit;
    end;
  if ip = sourceIP then
    begin
      byte_out := byte_out + data_size + header_size;
    end;  if ip = destIP then
    begin
      byte_in := byte_in + data_size + header_size;
    end;  if check_filter(proto, sourceIP, destIP, SourcePort, DestPort, data, data_size) then exit;
   setlength(buf_list[StringGrid1.RowCount - 2].buf, data_size);
  copymemory(buf_list[StringGrid1.RowCount - 2].buf, data, data_size);
 end;

解决方案 »

  1.   

    /1024 再format格式输出就行了
      

  2.   


    function BytesToStr(const i64Size: Int64): string;
    begin
      if i64Size >= 1073741824 {1024*1024*1024} then
        Result := format('%d.%2.2dGB', [i64Size shr 30, (i64Size * 100 shr 30) - (i64Size shr 30) * 100])
      else if i64Size >= 1048576 {1024*1024} then
        Result := format('%d.%2.2dMB', [i64Size shr 20, (i64Size * 100 shr 20) - (i64Size shr 20) * 100])
      else if i64Size >= 1024 then
        Result := format('%d.%2.2dKB', [i64Size shr 10, (i64Size * 100 shr 10) - (i64Size shr 10) * 100])
      else Result := format('%dB', [i64Size]);
    end;
      

  3.   

    真是服了你
    //定义两个全局变量
    var
      DataCount:DWORD;
      LastTick:DWORD;//在开始传输的地方加入两行初始化
      DataCount:=0;
      LastTick:=GetTickCount;
    function BytesToStr(const i64Size: Int64): string;
    begin
      if i64Size >= 1073741824 {1024*1024*1024} then
        Result := format('%d.%2.2dGB', [i64Size shr 30, (i64Size * 100 shr 30) - (i64Size shr 30) * 100])
      else if i64Size >= 1048576 {1024*1024} then
        Result := format('%d.%2.2dMB', [i64Size shr 20, (i64Size * 100 shr 20) - (i64Size shr 20) * 100])
      else if i64Size >= 1024 then
        Result := format('%d.%2.2dKB', [i64Size shr 10, (i64Size * 100 shr 10) - (i64Size shr 10) * 100])
      else Result := format('%dB', [i64Size]);
    end;//下面是你自己的过程
    procedure TForm1.cap_ip1Cap(ip, proto, sourceIP, destIP, SourcePort, 
      DestPort: string; header: PChar; header_size: Integer; data: PChar; 
      data_size: Integer); 
    var
      CurTick:DWORD;//定义一个
    begin 
      if not ((ip = sourceIP) or (ip = destIP)) then // 仅本机 
        begin 
          exit; 
        end; 
      if ip = sourceIP then 
        begin 
          byte_out := byte_out + data_size + header_size; 
        end;   if ip = destIP then 
        begin 
          byte_in := byte_in + data_size + header_size; 
        end;   if check_filter(proto, sourceIP, destIP, SourcePort, DestPort, data, data_size) then exit; 
      setlength(buf_list[StringGrid1.RowCount - 2].buf, data_size); 
      copymemory(buf_list[StringGrid1.RowCount - 2].buf, data, data_size);   //添加的代码
      if GetTickCount-LastTick>=1000 then
      begin
        Inc(DataCount,data_size);
        Caption:=BytesToStr(DataCount div (GetTickCount-LastTick))+'/s';
        LastTick:=GetTickCount;
      end;
    end;
      

  4.   

    上面的代码忘记将时间设置秒了,实际是毫秒,下面的代码修正了这个问题
    //定义两个全局变量
    var
      DataCount:DWORD;
      LastTick:DWORD;//在开始传输的地方加入两行初始化
      DataCount:=0;
      LastTick:=GetTickCount;
    function BytesToStr(const i64Size: Int64): string;
    begin
      if i64Size >= 1073741824 {1024*1024*1024} then
        Result := format('%d.%2.2dGB', [i64Size shr 30, (i64Size * 100 shr 30) - (i64Size shr 30) * 100])
      else if i64Size >= 1048576 {1024*1024} then
        Result := format('%d.%2.2dMB', [i64Size shr 20, (i64Size * 100 shr 20) - (i64Size shr 20) * 100])
      else if i64Size >= 1024 then
        Result := format('%d.%2.2dKB', [i64Size shr 10, (i64Size * 100 shr 10) - (i64Size shr 10) * 100])
      else Result := format('%dB', [i64Size]);
    end;//下面是你自己的过程
    procedure TForm1.cap_ip1Cap(ip, proto, sourceIP, destIP, SourcePort, 
      DestPort: string; header: PChar; header_size: Integer; data: PChar; 
      data_size: Integer); 
    begin 
      if not ((ip = sourceIP) or (ip = destIP)) then // 仅本机 
        begin 
          exit; 
        end; 
      if ip = sourceIP then 
        begin 
          byte_out := byte_out + data_size + header_size; 
        end;   if ip = destIP then 
        begin 
          byte_in := byte_in + data_size + header_size; 
        end;   if check_filter(proto, sourceIP, destIP, SourcePort, DestPort, data, data_size) then exit; 
      setlength(buf_list[StringGrid1.RowCount - 2].buf, data_size); 
      copymemory(buf_list[StringGrid1.RowCount - 2].buf, data, data_size);   //添加的代码
      if GetTickCount-LastTick>=1000 then
      begin
        Inc(DataCount,data_size);
        Caption:=BytesToStr(DataCount div ((GetTickCount-LastTick)div 1000))+'/s';
        LastTick:=GetTickCount;
      end;
    end;
      

  5.   

    喜欢 delphi的网友,请加我QQ750812538  ,一起交流啊!!