void CTraficatorDlg::OnBnClickedStart()
{
iSS = 1;
typedef struct IPHeader {
UCHAR iph_verlen; // версия и длина заголовка
UCHAR iph_tos; // тип сервиса
USHORT iph_length; // длина всего пакета
USHORT iph_id; // Идентификация
USHORT iph_offset; // флаги и смещения
UCHAR iph_ttl; // время жизни пакета
UCHAR iph_protocol; // протокол
USHORT iph_xsum; // контрольная сумма
ULONG iph_src; // IP-адрес отправителя
ULONG iph_dest; // IP-адрес назначения
} IPHeader;
WSADATA wsadata;
char name[128];
HOSTENT* phe;
SOCKADDR_IN sa;
IN_ADDR sa1;
unsigned long flag = 1; // Flag PROMISC On/Off.
unsigned short lowbyte;
unsigned short hibyte;
char Buffer[0x10000]; //64 Kb
char chInfo[64];
char *sizePack;
CWnd *pStatic = GetDlgItem(IDC_ERRORS);
if (WSAStartup(0x0202, &wsadata))
{
MessageBox("WSAStartup error !", NULL, 0);
WSACleanup();
}
else pStatic->SetWindowTextA("Winsock initial OK !");
if (gethostname(chInfo,sizeof(chInfo)))
{
MessageBox("Not local host", 0, 0);
exit(1);
}
else
{
pStatic->SetWindowTextA(chInfo);
}
phe = gethostbyname( name );
s = socket(AF_INET, SOCK_RAW, IPPROTO_IP );
if (s == INVALID_SOCKET)
{
MessageBox("Error create socket", 0, 0);
exit(1);
}
sa.sin_family = AF_INET;
sa.sin_addr.s_addr = ((struct in_addr*)phe->h_addr_list[0])->s_addr;
if (bind(s, (SOCKADDR *)&sa, sizeof(SOCKADDR)))
{
MessageBox("Error bind", 0, 0);
exit(1);
}
else pStatic->SetWindowTextA("Bind OK !!!");
// Enable promiscuous mode.
ioctlsocket(s, SIO_RCVALL, &flag);
pStatic->SetWindowTextA("Promiscuous mode is enable!!!");
while (iSS == 1)
{
int count;
count = recv( s, Buffer, sizeof(Buffer), 0 );
if( count >= sizeof(IPHeader) )
{
IPHeader* hdr = (IPHeader *)Buffer;
lowbyte = hdr->iph_length>>8;
hibyte = hdr->iph_length<<8;
hibyte = hibyte + lowbyte;
sizePack = itoa(hibyte,"",10);
pStatic->SetWindowTextA(sizePack);
}
}
}