原始套接字兑现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(&lt); 
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;
   
}




------解决方案--------------------