Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как считать траффик ? [D5, WinXP]


VID ©   (2004-05-04 11:46:00) 

Хочу узнать как можно считать ВХОДЯЩИЙ и ИСХОДЯЩИЙ траффик (раздельно) для какого-нибудь (по выбору)соединения.
Допустим есть обычное диал-ап соединение к интернету - как посчитать траффик проходящий за час, например ?


-=Rezya=-   (2004-05-06 07:01:00) [1]


> Не работает "в обе стороны по сетевой карте" только на приём.
> (Ну, конечно, свои ненаправленные пакеты отлавливает но
> это же не в обе стороны!?)


Не знаю. У меня в XP нормально все отлавливает. У verg-а тоже все прекрасно работает по 2000Win.

> Оффтоп:
> Андрей - зря ты воду взбаламутил


???????????????????????


MegaUser   (2004-05-06 04:42:00) [2]

#iptaf


Rouse_   (2004-05-05 23:31:00) [3]

Оффтоп:
Андрей - зря ты воду взбаламутил...


Torin   (2004-05-05 22:18:00) [4]

Не работает "в обе стороны по сетевой карте" только на приём. (Ну, конечно, свои ненаправленные пакеты отлавливает но это же не в обе стороны!?)


-=Rezya=-   (2004-05-05 01:12:00) [5]

WinSock2 возьми здесь http://home.earthlink.net/~akonshin/files/winsock2.zip
А по поводу mstcpip
То вот тебе этот UNIT с молчаливого согласия Verg-а :-))))

unit mstcpip;

interface
uses Winsock2;
type
  _tcp_keepalive  = packed record
     onoff : u_long;
     keepalivetime : u_long;
     keepaliveinterval : u_long;
  end;

const
// New WSAIoctl Options
SIO_RCVALL                           = IOC_IN or IOC_VENDOR or 1;
SIO_RCVALL_MCAST                     = IOC_IN or IOC_VENDOR or 2;
SIO_RCVALL_IGMPMCAST                 = IOC_IN or IOC_VENDOR or 3;
SIO_KEEPALIVE_VALS                   = IOC_IN or IOC_VENDOR or 4;
SIO_ABSORB_RTRALERT                  = IOC_IN or IOC_VENDOR or 5;
SIO_UCAST_IF                         = IOC_IN or IOC_VENDOR or 6;
SIO_LIMIT_BROADCASTS                 = IOC_IN or IOC_VENDOR or 7;
SIO_INDEX_BIND                       = IOC_IN or IOC_VENDOR or 8;
SIO_INDEX_MCASTIF                    = IOC_IN or IOC_VENDOR or 9;
SIO_INDEX_ADD_MCAST                  = IOC_IN or IOC_VENDOR or 10;
SIO_INDEX_DEL_MCAST                  = IOC_IN or IOC_VENDOR or 11;

// Values for use with SIO_RCVALL* options
 RCVALL_OFF             = 0;
 RCVALL_ON              = 1;
 RCVALL_SOCKETLEVELONLY = 2;

implementation

end.


VID   (2004-05-04 23:57:00) [6]

спасибо конечно за код, только вот при компиляции сразу же наткнулся на то, что у меня нету
WinSock2
mstcpip

что делать то ? пробовал найти соотв. файлы на компе - действительно нету


-=Rezya=-   (2004-05-04 18:20:00) [7]

Даа. Наверное уже в архив отпрвили. Ок тогда вото тебе код снифера приводимый тут Велики и незабвенным Verg-ом.

program Console;
{$APPTYPE CONSOLE}
uses
Windows,
SysUtils,
WinSock2,
mstcpip;
const
IP_MAXPACKET = 65535;
type
  PIPHeader = ^TIPHeader;
  TIPHeader = packed record
    verlen : byte;      // âåðñèÿ è äëèíà çàãîëîâêà
    tos    : byte;      // òèï ñåðâèñà
    length : word;      // äëèíà âñåãî ïàêåòà
    id     : word;      // Id
    offset : word;      // ôëàãè è ñìåùåíèÿ
    ttl    : byte;      // âðåìÿ æèçíè
    protocol : byte;    // ïðîòîêîë
    xsum   : word;      // êîíòðîëüíàÿ ñóììà
    src    : TInAddr;   // IP-àäðåñ îòïðàâèòåëÿ
    dst    : TInAddr;   // IP-àäðåñ íàçíà÷åíèÿ
  end;
var
WSAData : TWSAData;
Sa : TSockAddrIn;
Rcvd : integer;
RS   : TSocket;
flag : DWORD;
Buffer : array[0..IP_MAXPACKET] of byte;
Iph : PIpHeader;
Info : String;
Src, Dst : string;

function CtrlHandler(dwCtrlType : DWORD):BOOL; stdcall;
var S : TSocket;
begin
if RSINVALID_SOCKET then
begin
  S:= RS;
  RS := INVALID_SOCKET;
  CloseSocket(S);
end;
end;

function ToOem(const S : string):string;
begin
Result := S;
if Result'' then
  CharToOemBuff(pchar(Result), pchar(Result), length(Result));
end;

procedure PrintErr(Err : DWORD; Wt : boolean);
begin
Writeln(ToOem(SysErrorMessage(Err)));
if Wt then ReadLn;
end;

procedure ExitErr;
begin
if WSAGetLastErrorNO_ERROR then
  PrintErr(WSAGetLastError, true);
if Rs INVALID_SOCKET then
  CloseSocket(RS);
if WSAData.wVersion 0 then
  WSACleanup;
halt(0);
end;

function checksocket(Ret : integer):integer;
begin
Result := Ret;
if Result = SOCKET_ERROR then
   ExitErr;
end;

function ProtoString(Proto:byte):string;
begin
result:='';
case proto of
  IPPROTO_ICMP   : result:='ICMP';
  IPPROTO_TCP    : result:='TCP';
  IPPROTO_UDP    : result:='UDP';
  else
   result := 'other';
end;
end;

begin
RS := INVALID_SOCKET;
if ParamCount 1 then
begin
  Writeln('Usage: '+ExtractFileName(ParamStr(0))+' ');
  Readln;
  Exit;
end;
if WSAStartup(MAKEWORD(2, 2), WSAData) NO_ERROR then
   ExitErr;
try
  RS := socket(PF_INET, SOCK_RAW, IPPROTO_IP);
  if RS = INVALID_SOCKET then
    ExitErr;
  try
    ZeroMemory( @sa, sizeof(sa) );
    sa.sin_family := AF_INET;
    Dst := ParamStr(1);
    sa.sin_addr.S_addr := inet_addr(pchar(Dst));
    if bind(RS, @sa, sizeof(sa)) = SOCKET_ERROR then
      ExitErr;
    flag:= 1;
    if ioctlsocket(RS, SIO_RCVALL , flag) = SOCKET_ERROR then
      ExitErr;
    writeln('Rcv-len'#9'IP-len'#9'HDR-len'#9'From'#9#9'To'#9#9'Class'#9'Proto');
    SetconsoleCtrlHandler(@CtrlHandler, LongBool(TRUE));
    repeat
      Rcvd := checksocket( recv(RS, Buffer, sizeof(Buffer), 0) );// Вот эта строчка!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
      if Rcvd = 0 then continue;
      Iph := @Buffer;
      if (Iph^.verlen shr 4) = 4 then
      begin
        Info := '';
        if Iph^.src.S_addr = Sa.sin_addr.S_addr then
          Info := Info + 'O';
        if    (Iph^.dst.S_addr Sa.sin_addr.S_addr)
          and (Iph^.src.S_addr Sa.sin_addr.S_addr) then
          Info := Info + 'G';
        if Iph^.dst.S_addr = htonl( INADDR_BROADCAST ) then
          Info := Info +'Bn';
        Src := inet_ntoa(Iph^.src);
        Dst := inet_ntoa(Iph^.dst);
        Writeln(
           Rcvd, #9,
           ntohs( Iph^.length ),#9,
           (Iph^.verlen and $F) shl 2, #9,
           Src,#9,
           Dst,#9,
           Tooem(Info), #9,
           ProtoString(Iph^.protocol)
        );
      end;
    until Rcvd = 0;
  finally
    closesocket(RS);
  end;
finally
  WSACleanup;
end;
end.


В переменную  Rcvd при каждом принятом пакете заносится размер принятого пакета т.е. В дальнейшем сумируй и все....
Единственные оговорки:по DialUp- Работает только на прием. А по сетевой карте в обе стороны.
Направления можеш определять по адресу отправителя или получателя.


VID   (2004-05-04 13:52:00) [8]

Ввёл:
1. Подсчёт траффика.
2. Подсчёт трафика.
3. Сниффер.
4. Снифер.

Результатов - ноль. Либо поиск остался как и прежде нерабочим, либо информации нету.

а она нужна !


-=Rezya=-   (2004-05-04 13:18:00) [9]

Введи в поиске на этом сайте Снифер или подсчет трафика. Здесь по этому поводу много уже сказано. :-))))


Наверх

Титульная страница Поиск, карта сайта Написать письмо