Re: Помогите посчитать сетевой трафик!!
От: Corvin Украина  
Дата: 02.10.02 12:00
Оценка: 41 (6)
Здравствуйте 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 будет твой траффик.
Не забудь вколючить прект либы к тем двум хедерам
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.