Здравствуйте. Пытаюсь разобраться с написанием сниффера.
Вот мой код:
#include "stdafx.h"
#include <cstdlib>
#include <iostream>
#include <winsock2.h>
#include <stdio.h>
#include <string.h>
#include <windows.h>
#include <process.h>
#define SIO_RCVALL 0x98000001
using namespace std;
typedef struct IPHeader
{
unsigned char ip_header_len:4; // 4-bit header length (in 32-bit words) normally=5 (Means 20 Bytes may be 24 also)
unsigned char ip_version :4; // 4-bit IPv4 version
unsigned char ip_tos; // IP type of service
unsigned short ip_total_length; // Total length
unsigned short ip_id; // Unique identifier
unsigned char ip_frag_offset :5; // Fragment offset field
unsigned char ip_more_fragment :1;
unsigned char ip_dont_fragment :1;
unsigned char ip_reserved_zero :1;
unsigned char ip_frag_offset1; //fragment offset
unsigned char ip_ttl; // Time to live
unsigned char ip_protocol; // Protocol(TCP,UDP etc)
unsigned short ip_checksum; // IP checksum
unsigned int ip_srcaddr; // Source address
unsigned int ip_destaddr; // Source address
};
int main(int argc, char *argv[])
{
cout<<"Start...\n";
WSAData WSData;
WSAStartup(0x202,&WSData);
WSADATA wsadata;
SOCKET s;
char name[128];
HOSTENT* phe;
SOCKADDR_IN sa;
IN_ADDR sa1;
unsigned long flag = 1;
//создаем сокет
s = socket( AF_INET, SOCK_RAW, IPPROTO_IP );
//получаем имя нашего локального хоста
gethostname(name, sizeof(name));
phe = gethostbyname( name );
ZeroMemory( &sa, sizeof(sa) );
sa.sin_family = AF_INET;
sa.sin_addr.s_addr = ((struct in_addr *)phe->h_addr_list[0])->s_addr;
//привязать локальный адрес к нашему сокету
bind(s, (SOCKADDR *)&sa, sizeof(SOCKADDR));
//включение режима promiscuous
ioctlsocket(s, SIO_RCVALL, &flag);
while( 1 )
{
int count=0;
char Buffer[1024];
count = recv( s, Buffer, sizeof(Buffer), 0 );
if( count >= sizeof(IPHeader) )
{
IPHeader* hdr = (IPHeader *)Buffer;
sa1.s_addr = hdr->ip_srcaddr;
cout<<"Src:";
printf(inet_ntoa(sa1));
cout<<endl;
cout<<"Dest:";
sa1.s_addr = hdr->ip_destaddr;
printf(inet_ntoa(sa1));
cout<<endl;
if(hdr->ip_protocol == IPPROTO_TCP) printf("TCP ");
if(hdr->ip_protocol == IPPROTO_UDP) printf("UDP ");
}
}
WSACleanup ();
system("PAUSE");
return EXIT_SUCCESS;
}
Вроде ничего сложного не должно быть. В цикле пытаюсь ловить все входящие пакеты и выводить информацию по ним.
Но при запуске получаю следующие ( рис.1).
Подключил Wireshark, там пакеты поступают.
В чем может быть проблема? Помогите, пожалуйста . Заранее спасибо!