Здравствуйте Leader, Вы писали:
L>Недавно был топик про программу слежения за расходом сетевого трафика (NetXRay) под разные порты.
L>Дело в том, что мне надо написать точно такую же программу самому (курсовая), а я нигде не могу найти инфу по этой теме. Если у кого есть примеры реализации такой проги (язык значения не имеет) или нормальная документация, поделитесь плиз....
Кушайте на здоровье, — сам недавно писал.
#include "IpHlpApi.h"
#include "WinSock2.h"
#define MAX_SIZE 65535
SOCKADDR_IN addr; //адрес куда ты сокет будешь биндить
int nactive = TRUE;
IN_ADDR NetworkAddr; //адрес локальной сети, нужен если ты не хочешь считать пакеты из локалки
IN_ADDR NetworkMask; //маска локалки, - нужна для того же
typedef struct _tagippacket {
unsigned long l1;
unsigned long l2;
unsigned long l3;
IN_ADDR Src;
IN_ADDR Dst;
unsigned long l6;
} IPHEADER;
int MatchNetwork(IN_ADDR Ip, IN_ADDR Mask, IN_ADDR Net) //определяет принадлежит ли пакет локалке
{
return (Ip.S_un.S_addr & Mask.S_un.S_addr) == Net.S_un.S_addr;
}
UINT TrafThread(LPVOID p)
{
int Traffic=0;
WORD wVersionRequested;
int err;
DWORD dwCByte, dwFlag=0;
WSADATA wsaData;
SOCKET sock;
WSABUF wsabuf;
IPHEADER *pIP;
BYTE *lBuf;
int nIndex;
NetworkAddr.S_un.S_addr = 0;
NetworkMask.S_un.S_addr = 0;
wVersionRequested = MAKEWORD(2,0);
err = WSAStartup(wVersionRequested,&wsaData); //инициализируем WinSock
if (err != 0)
return 0;
if ( LOBYTE( wsaData.wVersion ) != 2 )
{
WSACleanup( );
return 0;
}
sock = WSASocket(AF_INET,SOCK_RAW,IPPROTO_IP,NULL,0,0);//Создаем сокет, -
//ответственный момент ибо здесь мы наделяем сокет способностью ловить ВСЕ пакеты,
//проходящие через сетевую плату.
if (sock == INVALID_SOCKET)
{
WSACleanup( );
return 0;
}
addr.sin_family = AF_INET;
addr.sin_port = htons(0);
MIB_IPADDRTABLE AdapterInfo;
unsigned long dwBytes=100;
if (GetIpAddrTable(&AdapterInfo,&dwBytes,true)!=NO_ERROR)
{
closesocket(sock);
WSACleanup( );
ErrorBox(GetLastError(),"GetIpTab");
return 0;
}
addr.sin_addr.S_un.S_addr=AdapterInfo.table[0].dwAddr;//тут будет твой ИП
NetworkAddr.S_un.S_un_b.s_b1=ххх;
NetworkAddr.S_un.S_un_b.s_b2=ххх;
NetworkAddr.S_un.S_un_b.s_b3=ххх;
NetworkAddr.S_un.S_un_b.s_b4=ххх;
NetworkMask.S_un.S_un_b.s_b1=ххх;
NetworkMask.S_un.S_un_b.s_b2=ххх;
NetworkMask.S_un.S_un_b.s_b3=ххх;
NetworkMask.S_un.S_un_b.s_b4=ххх;
if (bind(sock,(SOCKADDR *)&addr,sizeof(addr)) == SOCKET_ERROR)//привязываем сокет к адресу и порту
{
closesocket(sock);
WSACleanup( );
return 0;
}
err=1;
if (WSAIoctl(sock,SIO_RCVALL,&err,sizeof(err),NULL,0,&dwCByte,NULL,NULL) == SOCKET_ERROR) //здесь мы говорим сокету, чтобы ловил все пакеты
{
closesocket(sock);
WSACleanup( );
return 0;
}
wsabuf.len = MAX_SIZE;
wsabuf.buf = (char *) malloc(MAX_SIZE*sizeof(char));
while (nactive)
{ if (WSARecv(sock,&wsabuf,1,&dwCByte,&dwFlag,NULL,NULL)!=SOCKET_ERROR)
{
pIP=(IPHEADER *)wsabuf.buf;
lBuf=(BYTE *)wsabuf.buf;
if ( (MatchNetwork(pIP->Src,NetworkMask,NetworkAddr) && !MatchNetwork(pIP->Dst,NetworkMask,NetworkAddr)) ||
(!MatchNetwork(pIP->Src,NetworkMask,NetworkAddr) && MatchNetwork(pIP->Dst,NetworkMask,NetworkAddr)) )
{
Traffic +=(ntohl(pIP->l1)&0x0000FFFFL);
}
}
}
if (wsabuf.buf)
free(wsabuf.buf);
closesocket(sock);
WSACleanup();
return 0;
}
Вот и все, — запускаешь такое нитью и в Traffic будет твой траффик.
Не забудь вколючить прект либы к тем двум хедерам