原始套接字兑现ip协议分析,为什么只能抓到DHCP的包?求解释
原始套接字实现ip协议分析,为什么只能抓到DHCP的包?求解释
#include <vector>
#include <iostream>
#include <winsock2.h>
#include <stdlib.h>
#include "time.h"
#include <string>
#include <stdio.h>
#include <WS2TCPIP.H>
#include <WINDOWS.h>
#pragma comment( lib, "ws2_32.lib" )
using namespace std;
struct IPHeader
{
unsigned char mHeaderLengthAndVersion;
unsigned char mTypeOfService;
unsigned short mTotalLength; //2
unsigned short mIdentifier;
unsigned short mFlagAndFragoff;
unsigned char mTTL; //1
unsigned char mProtocolType;
unsigned short mCheckSum; //2
unsigned int mSourceIP; //4
unsigned int mDestIP;
unsigned int mOptions;
int getHeaderLength()
{
return mHeaderLengthAndVersion&0x0F;
}
int getVersion()
{
return mHeaderLengthAndVersion>>4;}
};
void ProcessIPPacket( char*, int );
in_addr source,dest;
char SourceIP[20]={0};//数据包内的源ip
char DestIP[20]={0};//数据包内的目的ip
string Time()
{
struct tm *ptr;
time_t lt;
char str[80];
lt=time(NULL);
ptr=localtime(<);
strftime(str,100,"%Y-%m-%d %H:%M:%S",ptr);
return str;
}
void main( )
{
WSADATA data;
WSAStartup( MAKEWORD( 2, 0 ), &data );
SOCKET rawSock = socket( AF_INET, SOCK_RAW, IPPROTO_IP );
setsockopt(rawSock, IPPROTO_IP, IP_HDRINCL,(char*)&rawSock , sizeof((char*)&rawSock));
char name[ 1024 ];
gethostname( name, sizeof( name ) );
hostent* ent = gethostbyname( name );
SOCKADDR_IN addr;
addr.sin_addr = *(in_addr*)ent->h_addr_list[0];
addr.sin_family = AF_INET;
addr.sin_port = htons( 8888 );
memcpy( &addr.sin_addr.S_un.S_addr, ent->h_addr_list[ 0 ], ent->h_length );
bind( rawSock, (PSOCKADDR)&addr, sizeof( addr ) );
for(;;)
{
vector<char> vc( 128 * 1024 );
ProcessIPPacket( &vc[0], recv( rawSock, &vc[0], (int)vc.size(), 0) );
}
}
int cnt=0;
void ProcessIPPacket( char* packet, int size )
{
IPHeader* header = (IPHeader*)packet;
cout<<"当前时间:"<< Time();
cout<<endl;
source.S_un.S_addr = header->mSourceIP;
dest.S_un.S_addr = header->mDestIP;
strcpy(SourceIP,inet_ntoa(source));//源地址IP
strcpy(DestIP,inet_ntoa(dest)); //目的地址IP
cout<<"版本:"<<header->getVersion()<<endl;
cout<<"IHL:"<<header->getHeaderLength()<<endl;
cout<<"源IP地址:"<<SourceIP<<endl;
cout<<"目的IP地址:"<<DestIP<<endl;
cout<<"上层协议号:"<<(int)header->mProtocolType<<endl;
cout<<"包总长度:"<<ntohs(header->mTotalLength)<<endl;
cout<<"TTL:"<<(int)header->mTTL <<endl;
cout<<"标识:"<<ntohs(header->mIdentifier)<<endl;
cout<<"校验和:"<<ntohs(header->mCheckSum)<<endl;
cout<<endl;
}
------解决方案--------------------
#include <vector>
#include <iostream>
#include <winsock2.h>
#include <stdlib.h>
#include "time.h"
#include <string>
#include <stdio.h>
#include <WS2TCPIP.H>
#include <WINDOWS.h>
#pragma comment( lib, "ws2_32.lib" )
using namespace std;
struct IPHeader
{
unsigned char mHeaderLengthAndVersion;
unsigned char mTypeOfService;
unsigned short mTotalLength; //2
unsigned short mIdentifier;
unsigned short mFlagAndFragoff;
unsigned char mTTL; //1
unsigned char mProtocolType;
unsigned short mCheckSum; //2
unsigned int mSourceIP; //4
unsigned int mDestIP;
unsigned int mOptions;
int getHeaderLength()
{
return mHeaderLengthAndVersion&0x0F;
}
int getVersion()
{
return mHeaderLengthAndVersion>>4;}
};
void ProcessIPPacket( char*, int );
in_addr source,dest;
char SourceIP[20]={0};//数据包内的源ip
char DestIP[20]={0};//数据包内的目的ip
string Time()
{
struct tm *ptr;
time_t lt;
char str[80];
lt=time(NULL);
ptr=localtime(<);
strftime(str,100,"%Y-%m-%d %H:%M:%S",ptr);
return str;
}
void main( )
{
WSADATA data;
WSAStartup( MAKEWORD( 2, 0 ), &data );
SOCKET rawSock = socket( AF_INET, SOCK_RAW, IPPROTO_IP );
setsockopt(rawSock, IPPROTO_IP, IP_HDRINCL,(char*)&rawSock , sizeof((char*)&rawSock));
char name[ 1024 ];
gethostname( name, sizeof( name ) );
hostent* ent = gethostbyname( name );
SOCKADDR_IN addr;
addr.sin_addr = *(in_addr*)ent->h_addr_list[0];
addr.sin_family = AF_INET;
addr.sin_port = htons( 8888 );
memcpy( &addr.sin_addr.S_un.S_addr, ent->h_addr_list[ 0 ], ent->h_length );
bind( rawSock, (PSOCKADDR)&addr, sizeof( addr ) );
for(;;)
{
vector<char> vc( 128 * 1024 );
ProcessIPPacket( &vc[0], recv( rawSock, &vc[0], (int)vc.size(), 0) );
}
}
int cnt=0;
void ProcessIPPacket( char* packet, int size )
{
IPHeader* header = (IPHeader*)packet;
cout<<"当前时间:"<< Time();
cout<<endl;
source.S_un.S_addr = header->mSourceIP;
dest.S_un.S_addr = header->mDestIP;
strcpy(SourceIP,inet_ntoa(source));//源地址IP
strcpy(DestIP,inet_ntoa(dest)); //目的地址IP
cout<<"版本:"<<header->getVersion()<<endl;
cout<<"IHL:"<<header->getHeaderLength()<<endl;
cout<<"源IP地址:"<<SourceIP<<endl;
cout<<"目的IP地址:"<<DestIP<<endl;
cout<<"上层协议号:"<<(int)header->mProtocolType<<endl;
cout<<"包总长度:"<<ntohs(header->mTotalLength)<<endl;
cout<<"TTL:"<<(int)header->mTTL <<endl;
cout<<"标识:"<<ntohs(header->mIdentifier)<<endl;
cout<<"校验和:"<<ntohs(header->mCheckSum)<<endl;
cout<<endl;
}
------解决方案--------------------