Форум: "Сети";
Текущий архив: 2004.06.27;
Скачать: [xml.tar.bz2];
ВнизКак считать траффик ? Найти похожие ветки
← →
VID © (2004-05-04 11:46) [0]Хочу узнать как можно считать ВХОДЯЩИЙ и ИСХОДЯЩИЙ траффик (раздельно) для какого-нибудь (по выбору)соединения.
Допустим есть обычное диал-ап соединение к интернету - как посчитать траффик проходящий за час, например ?
← →
-=Rezya=- (2004-05-04 13:18) [1]Введи в поиске на этом сайте Снифер или подсчет трафика. Здесь по этому поводу много уже сказано. :-))))
← →
VID © (2004-05-04 13:52) [2]Ввёл:
1. Подсчёт траффика.
2. Подсчёт трафика.
3. Сниффер.
4. Снифер.
Результатов - ноль. Либо поиск остался как и прежде нерабочим, либо информации нету.
а она нужна !
← →
-=Rezya=- (2004-05-04 18:20) [3]Даа. Наверное уже в архив отпрвили. Ок тогда вото тебе код снифера приводимый тут Велики и незабвенным 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 RS<>INVALID_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 WSAGetLastError<>NO_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))+" <IP address>");
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 23:57) [4]спасибо конечно за код, только вот при компиляции сразу же наткнулся на то, что у меня нету
WinSock2
mstcpip
что делать то ? пробовал найти соотв. файлы на компе - действительно нету
← →
-=Rezya=- (2004-05-05 01:12) [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.
← →
Torin (2004-05-05 22:18) [6]Не работает "в обе стороны по сетевой карте" только на приём. (Ну, конечно, свои ненаправленные пакеты отлавливает но это же не в обе стороны!?)
← →
Rouse_ © (2004-05-05 23:31) [7]Оффтоп:
Андрей - зря ты воду взбаламутил...
← →
MegaUser (2004-05-06 04:42) [8]#iptaf
← →
-=Rezya=- (2004-05-06 07:01) [9]
> Не работает "в обе стороны по сетевой карте" только на приём.
> (Ну, конечно, свои ненаправленные пакеты отлавливает но
> это же не в обе стороны!?)
Не знаю. У меня в XP нормально все отлавливает. У verg-а тоже все прекрасно работает по 2000Win.
> Оффтоп:
> Андрей - зря ты воду взбаламутил
???????????????????????
Страницы: 1 вся ветка
Форум: "Сети";
Текущий архив: 2004.06.27;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.046 c