![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как считать траффик ? [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]Введи в поиске на этом сайте Снифер или подсчет трафика. Здесь по этому поводу много уже сказано. :-))))