用C实现截获网络数据包(2)

37.int  Open_Raw_Socket()  {     
38.  int  sock; 
39.  if((sock  =  socket(AF_INET,  SOCK_RAW,  IPPROTO_TCP))  <  0)  { 
/*Then  the  socket  was  not  created  properly  and  must  die*/ 
40.  perror( "The  raw  socket  was  not  created "); 
41.  exit(0); 
42.  };   
43.  return(sock);   
44.  } 
     

                    

第39行  if((sock  =  socket(AF_INET,  SOCK_RAW,  IPPROTO_TCP))  <  0)  { 

这里我们调用了socket函数,使创建了了一个原始套接口,使之收到TCP/IP信息包。 

  接下来第11行-int  Set_Promisc(char  *interface,  int  sock),这也是我们的自定义函数,目的是把网卡置于混杂模式,具体内容如下: 
45.int  Set_Promisc(char  *interface,  int  sock  )  {    
46.  struct  ifreq  ifr;         
47.  strncpy(ifr.ifr_name,  interface,strnlen(interface)+1); 
48.  if((ioctl(sock,  SIOCGIFFLAGS,  &ifr)  ==  -1))  {   
/*Could  not  retrieve  flags  for  the  interface*/ 
49.  perror( "Could  not  retrive  flags  for  the  interface "); 
50.  exit(0); 
51.  }  
52.  printf( "The  interface  is  :::  %s\n ",  interface);   
53.  perror( "Retrieved  flags  from  interface  successfully "); 
54.  ifr.ifr_flags  |=  IFF_PROMISC;    
55.  if  (ioctl  (sock,  SIOCSIFFLAGS,  &ifr)  ==  -1  )  {    
/*Could  not  set  the  flags  on  the  interface  */    
56.  perror( "Could  not  set  the  PROMISC  flag: "); 
57.  exit(0);      
58.  } 
59.  printf( "Setting  interface  :::  %s  :::  to  promisc ",  interface); 
60.  return(0); 
61.  } 

  首先  struct  ifreq  ifr;  定一了一个ifrreg的结构ifr,接下来  strncpy(ifr.ifr_name,  interface,strnlen(interface)+1);,就是把我们网络设备的名字填充到ifr结构中,在这里  #define  INTERFACE  "eth0 "  ,让我们再往下看,ioctl(sock,  SIOCGIFFLAGS,  &ifr),SIOCGIFFLAGS请求表示需要获取接口标志,现在到了第54行,在我们成功的获取接口标志后把他设置成混杂模式,ifr.ifr_flags  |=  IFF_PROMISC;ioctl  (sock,  SIOCSIFFLAGS,  &ifr)。OK,现在我们所说的第一步已经完成--------把网卡置于混杂模式。 

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/3d122bb7aa442cad14642d1aa782dcba.html