Пы таюсь использовать вот такой код для подсчета тафика в между 2 ip
char Buffer[MAX_PACKET_SIZE]; // 64 Kb
DataWSA * pD = (DataWSA *) lpParameter;
WSADATA wsadata; // Èíèöèàëèçàöèÿ WinSock.
SOCKET s; // Cëóùàþùèé ñîêåò.
char name[128]; // Èìÿ õîñòà (êîìïüþòåðà).
HOSTENT* phe; // Èíôîðìàöèÿ î õîñòå.
SOCKADDR_IN sa; // Àäðåñ õîñòà
unsigned long flag = 1; // Ôëàã PROMISC Âêë/âûêë.
// èíèöèàëèçàöèÿ
WSAStartup(MAKEWORD(2,2), &wsadata);
s = socket( AF_INET, SOCK_RAW, IPPROTO_IP );
gethostname(name, sizeof(name));
phe = gethostbyname( name );
ZeroMemory( &sa, sizeof(sa) );
sa.sin_family = AF_INET;
//DWORD d=*(DWORD*)pD->Interfase.m_IP.IP;;
//DWORD d1= ((struct in_addr *)phe->h_addr_list[0])->s_addr;;
sa.sin_addr.s_addr = *(DWORD*)pD->Interfase.m_IP.IP;//phe->h_addr_list[0])->s_addr;
bind(s, (SOCKADDR *)&sa, sizeof(SOCKADDR));
// Âêëþ÷åíèå promiscuous mode.
ioctlsocket(s, SIO_RCVALL, &flag);
// Ïðè¸ì IP-ïàêåòîâ.
while( !pD->stopWSA )
{
int count;
count = recv( s, Buffer, sizeof(Buffer), 0 );
// îáðàáîòêà IP-ïàêåòà
if( count >= sizeof(IPHeader) )
{
IPHeader* hdr = (IPHeader *)Buffer;
//Пробегаем по спbску IP
for (int i=0 ;i< pD->m_IP_data.GetSize();i++)
{
if (
(*(long*)hdr->src.IP==*(long*)pD->m_IP_data[i].m_IP.IP)&&
(*(long*)hdr->dest.IP==*(long*)pD->m_SrvIP.m_IP.IP)
)
{
pD->m_IP_data[i].m_Out +=count;
}
if (
(*(long*)hdr->dest.IP==*(long*)pD->m_IP_data[i].m_IP.IP)&&
(*(long*)hdr->src.IP==*(long*)pD->m_SrvIP.m_IP.IP)
)
{
pD->m_IP_data[i].m_In +=count;
}
} //ip
}
}
На w2000 (где разрабатывал) результаты похожи на правду ....
При установке на штатное место (XP+Firewall+UserGate) программа начинает ошибаться в разы.....