网络抓包capture_paket

简介: /* capture_packet.c - 截获所有以太网帧数据并进行具体分析 */ /* 常用函数的头文件   */#include #include #include   #include #include   #include /* 与网络相关的头文件 */#includ...

/* capture_packet.c - 截获所有以太网帧数据并进行具体分析 */

/* 常用函数的头文件   */
#include
#include
#include  
#include
#include  
#include

/* 与网络相关的头文件 */
#include
#include
#include  
#include  
#include   
#include  
#include  
#include  
#include
#include  
#include  
#include  
#include  
#include  
#include
#include
#include
#include


/* 全局变量结构的结构体原型 - 包含要记录的任何全局信息 */
struct global_info {
 unsigned int bytes;  /* 网卡接收的总字节数     */
 unsigned int packet_num;        /* 网卡接受的帧的总数量   */
 
 unsigned int packet_arp;        /* 接收到的arp包的数量    */
 unsigned int packet_rarp;       /* 接收到的rarp包的数量   */

 unsigned int packet_ip;  /* 接收到的ip包的数量     */
 unsigned int packet_icmp; /* 接收到的icmp包的数量   */
 unsigned int packet_igmp; /* 接收到的igmp包的数量   */

 unsigned int packet_tcp; /* 接收到的tcp包的数量    */
 unsigned int packet_udp; /* 接收到的udp包的数量    */
 
 int print_flag_frame;  /* 是否打印帧头信息标志, 1表示打印, 0表示不打印 */
 int print_flag_arp;  /* 是否打印arp头信息标志  */
 int print_flag_ip;  /* 是否打印ip头信息标志   */
 int print_flag_rarp;  /* 是否打印rarp头信息标志 */
 int print_flag_tcp;  /* 是否打印tcp头信息标志  */
 int print_flag_udp;  /* 是否打印udp头信息标志  */
 int print_flag_icmp;  /* 是否打印icmp头信息标志 */
 int print_flag_igmp;  /* 是否打印igmp头信息标志 */
};


/* 一个用于初始化全局信息的函数 */
void init_global( struct global_info  * var );

/* 一个用于打印全局信息的函数   */
void print_global( struct global_info var );

/* 打印一个错误,并退出   */
void error_and_exit( char * msg, int exit_code );

/* 设置网卡成混杂模式         */
int set_card_promisc( char * interface_name, int sock );

/* 把mac地址转换一个字符串      */
void mac_to_str( char * buf, char * mac_buf );

/* 用于打印帮助信息   */
void help( void );

/* 截获网卡帧数据,并进行数据分用*/
void do_frame( int sockfd ); 


/* 处理ip层数据          */
void do_ip( char * data );

/* 打印ip头信息          */
void print_ip( struct iphdr * );

/* 处理arp层数据        */
void do_arp( char * data );

/* 打印arp头信息         */
void print_arp( struct arphdr * );

/* 处理rarp数据         */
void do_rarp( char * data );


/* 处理tcp层数据         */
void do_tcp( char * data );

/* 打印tcp层头信息         */
void print_tcp( struct tcphdr * );

/* 处理udp层数据         */
void do_udp( char * data );

/* 打印udp层头信息         */
void print_udp( struct udphdr * );


/* 处理icmp层数据        */
void do_icmp( char * data );

/* 打印icmp头信息        */
void print_icmp( struct icmphdr * );

/* 处理igmp层数据         */
void do_igmp( char * data );

/* 打印igmp头信息        */
void print_igmp( struct igmphdr * );


/* 定义一个全局变量,用于存储全局信息 */
struct global_info global;


/* 初始化一个全局结构体        */
void init_global( struct global_info  * var )
{
 var->bytes = 0;
 var->packet_num = 0;
 
 var->packet_arp = 0;
 var->packet_rarp = 0;
 var->packet_ip = 0;
 var->packet_icmp = 0;
 var->packet_igmp = 0;
 var->packet_tcp = 0;
 var->packet_udp = 0;
 
 var->print_flag_frame = 0;
 var->print_flag_arp = 0;
 var->print_flag_ip = 0;
 var->print_flag_rarp = 0;
 var->print_flag_tcp = 0;
 var->print_flag_udp = 0;
 var->print_flag_icmp = 0;
 var->print_flag_igmp = 0;
}

/* 一个用于打印全局信息的函数  */
void print_global( struct global_info var )
{
 printf("\n\n********** 全局信息 *****************\n\n");
 printf("总共接收字节数: %d kbytes.\n", var.bytes / 1024 );
 printf("总共接受包数量: %d\n\n", var.packet_num );
 
 if( var.packet_arp ) printf("接收 arp 包数量: %d\n", var.packet_arp );
 if( var.packet_rarp) printf("接收 rarp 包数量: %d\n", var.packet_rarp );
 if( var.packet_ip )  printf("接收 ip 包数量: %d\n", var.packet_ip );
 if( var.packet_icmp) printf("接收 icmp 包数量: %d\n", var.packet_icmp );
 if( var.packet_igmp) printf("接收 igmp 包数量: %d\n", var.packet_igmp );
 if( var.packet_tcp ) printf("接收 tcp 包数量: %d\n", var.packet_tcp );
 if( var.packet_udp ) printf("接收 udp 包数量: %d\n", var.packet_udp );
 
 printf("\n");
}

/* 用于处理当下按ctrl-c时的处理函数 */
void sig_int( int sig )
{
 print_global( global );
 exit( 0 );
}

/* 打印错误信息,并退出            */
void error_and_exit( char * msg, int exit_code ) 

 herror( msg ); 
 exit( exit_code ); 

/* 设置网卡模式成混帐模式,这样的话可以截获以太网帧数据 */
int set_card_promisc( char * interface_name, int sock ) 

 /* 用于套接口ioctl的接口请求结构体  */
 struct ifreq ifr;
               
 /* 复制网卡名称进入请求结构体的名称元素 */
 strncpy(ifr.ifr_name, interface_name ,strlen( interface_name )+1); 

 /* 通过ioctl获得相应信息         */
 if((ioctl(sock, SIOCGIFFLAGS, &ifr) == -1)) {        
     error_and_exit("ioctl", 2); 
 } 

 /* 设置网卡模式标志为混杂模式        */
     ifr.ifr_flags |= IFF_PROMISC;               

 /* 通过ioctl把参数传递给网卡        */ 
 if(ioctl(sock, SIOCSIFFLAGS, &ifr) == -1 )        
        error_and_exit("ioctl", 3); 

/* 把mac地址转换成字符串 */
void mac_to_str( char * buf, char * mac_buf )
{
 sprintf( mac_buf, "%02x:%02x:%02x:%02x:%02x:%02x",(unsigned char) *buf, (unsigned char)(*(buf+1)),
     (unsigned char)(*(buf+2)), (unsigned char)(*(buf+3)),
     (unsigned char)(*(buf+4)), (unsigned char)(*(buf+5)));
 mac_buf[17] = 0;
}

void help( void )
{
 printf("Usage: capture [-h] [协议名称 ...].\n");
 printf("默认情况: 打印所有包信息.\n");
}

void print_udp( struct udphdr * pudp )
{
 printf("==================== udp 头信息 ======================\n");
 printf("16位源端口号  : %d\n", ntohs( pudp->source ) );
 printf("16位目的端口号: %d\n", ntohs( pudp->dest ) );
 printf("16位udp长度: %d\n", ntohs( pudp->len ) );
 printf("16位udp校验和: %d\n", ntohs( pudp->check ) );
 if( ntohs( pudp->len ) != sizeof(struct udphdr ) && ntohs( pudp->len )   char * data = ( char * )pudp + sizeof( struct udphdr );
  //printf("UDP数据: %s\n", data );
 }
}

void do_udp( char * data )
{
 global.packet_udp ++;

 struct udphdr * pudp = (struct udphdr *)data;
 if( global.print_flag_udp )
  print_udp( pudp ); 
}


void print_tcp( struct tcphdr * ptcp )
{
 printf("==================== tcp 头信息 =====================\n");
 printf("源端口号  : %d\n", ntohs( ptcp->source ) );
 printf("目的端口号: %d\n", ntohs( ptcp->dest ) );
 printf("32位序列号  : %u\n", ntohl( ptcp->seq ) );
 printf("32位确认序号: %u\n", ntohl( ptcp->ack_seq ) );
 printf("首部长度: %d\n", ptcp->doff * 4 );
 printf("6个标志位: \n");
 printf("    紧急指针 urg : %d\n", ptcp->urg );
 printf("    确认序号位 ack : %d\n", ptcp->ack );
 printf("    接受方尽快将报文交给应用层 psh : %d\n", ptcp->psh );
 printf("    重建连接 rst : %d\n", ptcp->rst );
 printf("    用来发起连接的同步序号 syn : %d\n", ptcp->syn );
 printf("    发送端完成任务 fin : %d\n", ptcp->fin );
 printf("16位窗口大小: %d\n", ntohs( ptcp->window ) );
 printf("16位校验和: %d\n", ntohs( ptcp->check ) );
 printf("16位紧急指针: %d\n", ntohs( ptcp->urg_ptr ) );
  
 if( ptcp->doff * 4 == 20 ){
  //printf("选项数据: 没有\n");
 } else {
  //printf("选项数据: %d 字节\n", ptcp->doff * 4 - 20 );
 }
 
 char * data = ( char * )ptcp;
 data += ptcp->doff * 4;
 printf("数据长度: %d 字节\n", strlen(data) );
 //if( strlen(data) }

void do_tcp( char * data )
{
 global.packet_tcp ++;

 struct tcphdr * ptcp;
 ptcp = ( struct tcphdr * )data;
 
 if( global.print_flag_tcp ) 
  print_tcp( ptcp );
}

void print_igmp( struct igmphdr * pigmp )
{
 printf("====================  igmp 包信息 ==========================\n");
 printf("igmp 版本: %d\n", pigmp->type & 15 );
 printf("igmp 类型: %d\n", pigmp->type >> 4 );
 printf("igmp 码: %d\n", pigmp->code );
 printf("igmp 校验和: %d\n", ntohs( pigmp->csum ) );
 printf("igmp 组地址: %d\n", ntohl( pigmp->group ) );
}

void do_igmp( char * data )
{
 global.packet_igmp ++;
 struct igmphdr * pigmp = ( struct igmphdr * ) data;
 
 if( global.print_flag_igmp )
  print_igmp( pigmp );
}

void print_icmp( struct icmphdr * picmp )
{
 printf("==================== icmp 包信息 ===========================\n");
 
 printf("消息类型: %d ", picmp->type );
  switch( picmp->type ){
   case ICMP_ECHOREPLY:
    printf("Ping的回显应答\n");
    break;
   case ICMP_DEST_UNREACH:
          printf("目的不可达\n");
    break;
   case ICMP_SOURCE_QUENCH:
    printf("源端被关闭\n");
    break;
   case ICMP_REDIRECT:
    printf("重定相\n"); 
    break;
   case ICMP_ECHO:
    printf("ping的回显请求\n");   
    break;
   case ICMP_TIME_EXCEEDED:
    printf("超时\n");
    break;
   case ICMP_PARAMETERPROB:
    printf("参数问题\n");
    break;
   case ICMP_TIMESTAMP:
    printf("时间戳请求\n");  
    break;
   case ICMP_TIMESTAMPREPLY:
    printf("时间戳应答\n");  
    break;
   case ICMP_INFO_REQUEST:
    printf("信息请求\n"); 
    break;
   case ICMP_INFO_REPLY:
    printf("信息应答\n");
    break;
   case ICMP_ADDRESS:
    printf("地址掩码请求\n");
    break;
   case ICMP_ADDRESSREPLY:
    printf("地址掩码应答\n");
    break;
   default:
    printf("未知消息类型\n");
    break;
  }
 printf("消息类型的子选项: %d ", picmp->code );
  switch( picmp->type ){
   case ICMP_ECHOREPLY:
    printf("Ping的回显应答\n");
    break;
   case ICMP_DEST_UNREACH:
    switch( picmp->type ){
     case ICMP_NET_UNREACH:
      printf("网络不可到达\n");
      break;
     case ICMP_HOST_UNREACH:
      printf("主机不可到达\n"); 
      break;
     case  ICMP_PROT_UNREACH:
      printf("协议不可到达\n");
      break; 
     case  ICMP_PORT_UNREACH:
      printf("端口不可到达\n");
      break;
     case  ICMP_FRAG_NEEDED:
      printf("需要进行分片,但是又设置不分片位\n");
      break;
     case  ICMP_SR_FAILED:
      printf("源站选路失败\n");
      break;
     case  ICMP_NET_UNKNOWN:
      printf("目的网络不认识\n");
      break;
     case  ICMP_HOST_UNKNOWN:
      printf("目的主机不认识\n");
      break;
     case  ICMP_HOST_ISOLATED:
      printf("源主机北隔离\n");
      break;
     case  ICMP_NET_ANO:
      printf("目的网络被强制禁止\n");
      break;
     case  ICMP_HOST_ANO:
      printf("目的主机被强制禁止\n");
      break;
     case  ICMP_NET_UNR_TOS:
      printf("由于服务类型TOS,网络不可到达\n");
      break;
     case  ICMP_HOST_UNR_TOS:
      printf("由于服务类型TOS,主机不可到达\n");
      break;
     case  ICMP_PKT_FILTERED:
      printf("由于过滤,通信被强制禁止\n");
      break;
     case  ICMP_PREC_VIOLATION:
      printf("主机越权\n");
      break;
     case  ICMP_PREC_CUTOFF:
      printf("优先权中止生效\n");
      break;
     default:
      printf("未知代码\n");
      break;

    }
    break;
   case ICMP_SOURCE_QUENCH:
    printf("源端被关闭\n");
    break;
   case ICMP_REDIRECT:
    switch( picmp->type ){
     case ICMP_REDIR_NET:
      printf("对网络重定向\n");
      break;
     case ICMP_REDIR_HOST:
      printf("对主机重定向\n");  
      break;
     case ICMP_REDIR_NETTOS:
      printf("对服务类型和网络重定向\n"); 
      break;
     case ICMP_REDIR_HOSTTOS:
      printf("对服务类型和主机重定向\n");
      break;
     defalut:
      printf("未知代码\n");
      break;
    }
    break;
   case ICMP_ECHO:
    printf("ping的回显请求\n");   
    break;
   case ICMP_TIME_EXCEEDED:
    switch( picmp->type ){
     case ICMP_EXC_TTL:
      printf("在传输期间生存时间为0\n");
      break;
     case ICMP_EXC_FRAGTIME:
      printf("在数据组装期间生存时间为0\n");
      break;
     default:
      printf("未知代码\n");
      break;
    }
    break;
   case ICMP_PARAMETERPROB:
    switch( picmp->type ){
     case 0:
      printf("IP首部错误(包括各种差错)\n");
      break;
     case 1:
      printf("缺少必须的选项\n");
      break;
     default:
      printf("原因未知\n");
      break;
    }
    break;
   case ICMP_TIMESTAMP:
    printf("时间戳请求\n");  
    break;
   case ICMP_TIMESTAMPREPLY:
    printf("时间戳应答\n");  
    break;
   case ICMP_INFO_REQUEST:
    printf("信息请求\n"); 
    break;
   case ICMP_INFO_REPLY:
    printf("信息应答\n");
    break;
   case ICMP_ADDRESS:
    printf("地址掩码请求\n");
    break;
   case ICMP_ADDRESSREPLY:
    printf("地址掩码应答\n");
    break;
   default:
    printf("未知消息类型\n");
    break;
  }

 printf("校验和: %d\n", ntohs(picmp->checksum) );
}

void do_icmp( char * data )
{
 global.packet_icmp ++;

 struct icmphdr * picmp = ( struct icmphdr * ) data;
 
 if( global.print_flag_icmp )
  print_icmp( picmp );
}

void print_ip( struct iphdr * iph )
{
 printf("=============== ip 头信息 ===============\n");
 printf("IP 首部长度:%d\n", iph->ihl * 4 );
 printf("IP 版本    :%d\n", iph->version );
 printf("服务类型(tos): %d\n", iph->tos );
 printf("总长度字节: %d\n", ntohs(iph->tot_len) );
 printf("16位标识: %d\n", ntohs(iph->id) );
 printf("frag off: %d\n", ntohs(iph->frag_off) );
 printf("8位生存事件: %d\n", iph->ttl );
 printf("8位协议: %d\n", iph->protocol );
 printf("16位首部校验和: %d\n", ntohs(iph->check) );
 printf("32位源IP地址  : %s\n", inet_ntoa( *(struct in_addr *)(&iph->saddr)) );
 printf("32位目的IP地址: %s\n", inet_ntoa( *(struct in_addr *)(&iph->daddr)) );
  
}

void do_ip( char * data )
{
 global.packet_ip ++;

 struct iphdr *pip;        
 pip = ( struct iphdr * ) data;    /* pip = point to ip layer */
 if( global.print_flag_ip )
  print_ip( pip );
 
 char * pdata = data + pip->ihl * 4;
 
 switch( pip->protocol ){
  case IPPROTO_ICMP:
   do_icmp( pdata );
   break;
  case IPPROTO_IGMP:
   do_igmp( pdata );
   break;
  case IPPROTO_TCP:
   do_tcp( pdata );
   break;
  case IPPROTO_UDP:
   do_udp( pdata );
   break;
  default:
   printf("IP: 未知其上层协议.\n");
   break;
 }
}

void print_arp( struct arphdr * parp )
{

 printf("硬件类型: %d ", ntohs(parp->ar_hrd) );
  switch( ntohs( parp->ar_hrd ) ){
   case ARPHRD_ETHER:
    printf("Ethernet 10/100Mbps.\n"); 
    break;
   case ARPHRD_EETHER:
    printf("Experimental Ethernet.\n");
    break;
   case ARPHRD_AX25:
    printf("AX.25 Level 2.\n");
    break;
   case ARPHRD_PRONET:
    printf("PROnet token ring.\n");
    break;
   case ARPHRD_IEEE802:
    printf("IEEE 802.2 Ethernet/TR/TB.\n");
    break;
   case ARPHRD_APPLETLK:
    printf("APPLEtalk.\n");
    break;
   case ARPHRD_ATM: 
    printf("ATM.\n");      
    break;
   case ARPHRD_IEEE1394:
    printf("IEEE 1394 IPv4 .\n");
    break;
   default:
    printf("Unknow.\n");
    break;
  }
 printf("映射的协议地址类型: %d ", ntohs(parp->ar_pro) );
  switch( ntohs(parp->ar_pro) ){
   case ETHERTYPE_IP:
    printf("IP.\n");
    break;
   default:
    printf("error.\n");
    break;
  }
 printf("硬件地址长度: %d\n", parp->ar_hln );
 printf("协议地址长度: %d\n", parp->ar_pln );
 printf("操作码: %d ", ntohs(parp->ar_op) );
  switch( ntohs(parp->ar_op) ){
   case ARPOP_REQUEST:
    printf("ARP 请求.\n");
    break;
   case ARPOP_REPLY: 
    printf("ARP 应答.\n");
    break;
   case ARPOP_RREQUEST:
    printf("RARP 请求.\n");
    break;
   case ARPOP_RREPLY:
    printf("RARP 应答.\n");
    break;
   case ARPOP_InREQUEST:
    printf("InARP 请求.\n");
    break;
   case ARPOP_InREPLY:
    printf("InARP 应答.\n");   
    break;
   case ARPOP_NAK:
    printf("(ATM)ARP NAK.\n");
    break;
   default:
    printf("arp 操作码错误.\n");
    break;
  }
 
 char * addr = (char*)(parp + 1);
 char buf[18];
 mac_to_str( addr, buf );
 printf("发送端以太网地址: %s\n", buf );
 printf("发送端IP地址:     %s\n", inet_ntoa( *(struct in_addr *)(addr+6) ));
 mac_to_str( addr+10, buf );
 printf("目的以太网地址: %s\n", buf );
 printf("目的IP地址:     %s\n", inet_ntoa( *(struct in_addr *)(addr+16) ));
}

void do_arp( char * data )
{
 global.packet_arp ++;

 struct arphdr * parp;
 parp = ( struct arphdr * ) data;
 
 if( global.print_flag_arp ) {
  printf("============= arp 头信息 ==============\n");
  print_arp( parp );
 }
}

void do_rarp( char * data )
{
 global.packet_rarp ++;


 struct arphdr * parp;
 parp = ( struct arphdr * ) data;
 
 if( global.print_flag_rarp ){
  printf("============= rarp 头信息 =============\n");
  print_arp( parp );
 }
}

/* 打印以太网帧的包头信息 */
void print_frame( struct ether_header * peth )
{
 /* 定义一个数组,用于存储把mac地址转换成字符串后的字符串 */
 char buf[ 18 ];

 printf("\n==================================   第 %d 个包  =======================================\n\n", global.packet_num );
 printf("==== 以太网帧信息 =====\n");
 char * shost = peth->ether_shost;
 mac_to_str( shost, buf );  
 printf("源以太网地址:  %s\n", buf );
 
 char * dhost = peth->ether_dhost;
 mac_to_str( dhost, buf );
 printf("目的以太网地址:%s\n", buf );
}


/* 用于从网卡接受一帧数据,同时根据以太网协议字段传递数据给相应的上层协议处理 */
void do_frame( int sock )
{
 /* 用于存储一帧数据         */
 char frame_buf[ 2000 ];
 
 /* 清空帧数据缓冲区     */
 bzero( frame_buf, sizeof(frame_buf) );

 int len = sizeof( frame_buf );
 
 /* 用于存储接受字节数       */
 int recv_num;

 /* 用于存储发送方的地址信息 */
 struct sockaddr_in addr;

 /* 从网卡接收一帧数据       */
        recv_num = recvfrom( sock, (char *)frame_buf, sizeof( frame_buf ), 0, ( struct sockaddr * )&addr, &len ); 

 /* 所接收的包的总数自加1    */
 global.packet_num ++;

 /* 从网卡接收的字节总数     */
 global.bytes += recv_num;

 /* 打印接收的包是第几个包   */
 //printf("此帧数据长度: %d\n", recv_num );
 
 /* 定义一个用于指向以太网帧的指针 (这里我们只考虑最常见的以太网帧的情况) */
 struct ether_header * peth;

 /* 让以太网头指针指向从网卡接受到的帧的数据的开头 */
        peth = (struct ether_header *)frame_buf;

 /* 传递以太网帧首地址给打印以太网帧信息的打印函数 */
 if( global.print_flag_frame )
  print_frame( peth );

 /* 定义一个数据指针,用于指向以太网帧的数据部分    */
 char * pdata;

 /* 让 pdata 指向以太网帧的数据部分                */
 pdata = frame_buf + sizeof( struct ether_header );

 /* 根据以太网帧的协议字段进行数据分用 - 也就是进行数据拆封,根据协议字段调用相应层的处理函数 */
        switch( ntohs( peth->ether_type ) ){
       case ETHERTYPE_PUP:
   break;
  case ETHERTYPE_IP:
   do_ip( pdata );
   break;
  case ETHERTYPE_ARP:
   do_arp( pdata );
   break;
  case ETHERTYPE_REVARP:
   do_rarp( pdata );
   break;
  default:
   printf("Unkonw ethernet type  %d %x.\n", ntohs(peth->ether_type), ntohs(peth->ether_type) );
   break;
       }
}


/* 主函数, 处理命令行输入, 设置好全局变量, 并调用接受和处理帧的函数 */

int main( int argc, char ** argv ) 

 /* 用于存储套接口文件描述符 */
 int sockfd;

 /* 初始化全局变量    */
 init_global( &global );

 if( argc == 1 ) {         /* 表示打印所有包头信息 */
  global.print_flag_frame = 1;
  global.print_flag_arp = 1;
  global.print_flag_ip = 1;
  global.print_flag_rarp = 1;
  global.print_flag_tcp = 1;
  global.print_flag_udp = 1;
  global.print_flag_icmp = 1;
  global.print_flag_igmp = 1;
 } else {         /* 帮助 或者 通过指定协议名称只打印某层些协议 */
  if( !strcasecmp( argv[1], "-h" ) ){
   help();
   exit( 0 );
  } else {
   int i;
   for( i=1; i     if( !strcasecmp( argv[i], "frame" ) )
     global.print_flag_frame = 1;
    else if( !strcasecmp( argv[i], "arp" ) )
     global.print_flag_arp = 1;
    else if( !strcasecmp( argv[i], "rarp" ) )
     global.print_flag_rarp = 1;
    else if( !strcasecmp( argv[i], "ip" ) )
     global.print_flag_ip = 1;
    else if( !strcasecmp( argv[i], "tcp" ) )
     global.print_flag_tcp = 1;
    else if( !strcasecmp( argv[i], "udp" ) )
     global.print_flag_udp = 1;
    else if( !strcasecmp( argv[i], "icmp" ) )
     global.print_flag_icmp = 1;
    else if( !strcasecmp( argv[i], "igmp" ) )
     global.print_flag_igmp = 1;
   }
  }
 }
 
 /* 通过协议族AF_PACKET类信SOCK_RAW, 类型SOCK_RAW创建一个用于可以接受网卡帧数据的套接口,同时返回套就口文件描述符 */
 if( (sockfd = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL)) ) == -1 )
         error_and_exit( "socket", 1 );  /* 如果发生错误,返回错误值, 并退出 */

 
 /* 设定网卡eth0成混杂模式 */
 set_card_promisc( "eth0", sockfd );

 /* 设定信号处理函数, 下面是设置当我们按下ctrl-c时所调用的处理函数 */ 
 signal( SIGINT, sig_int );

 /* 无限循环接收以太网卡数据帧, 并进行数据分用,直到你按下ctrl-c */
 while( 1 ){
  do_frame( sockfd );
 } 

 return 0;
}

 

目录
相关文章
|
7天前
|
存储 SQL 安全
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
随着互联网的普及,网络安全问题日益突出。本文将介绍网络安全的重要性,分析常见的网络安全漏洞及其危害,探讨加密技术在保障网络安全中的作用,并强调提高安全意识的必要性。通过本文的学习,读者将了解网络安全的基本概念和应对策略,提升个人和组织的网络安全防护能力。
|
8天前
|
SQL 安全 网络安全
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
随着互联网的普及,网络安全问题日益突出。本文将从网络安全漏洞、加密技术和安全意识三个方面进行探讨,旨在提高读者对网络安全的认识和防范能力。通过分析常见的网络安全漏洞,介绍加密技术的基本原理和应用,以及强调安全意识的重要性,帮助读者更好地保护自己的网络信息安全。
31 10
|
10天前
|
SQL 安全 网络安全
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
在数字化时代,网络安全和信息安全已成为我们生活中不可或缺的一部分。本文将介绍网络安全漏洞、加密技术和安全意识等方面的内容,并提供一些实用的代码示例。通过阅读本文,您将了解到如何保护自己的网络安全,以及如何提高自己的信息安全意识。
38 10
|
10天前
|
存储 监控 安全
云计算与网络安全:云服务、网络安全、信息安全等技术领域的融合与挑战
本文将探讨云计算与网络安全之间的关系,以及它们在云服务、网络安全和信息安全等技术领域中的融合与挑战。我们将分析云计算的优势和风险,以及如何通过网络安全措施来保护数据和应用程序。我们还将讨论如何确保云服务的可用性和可靠性,以及如何处理网络攻击和数据泄露等问题。最后,我们将提供一些关于如何在云计算环境中实现网络安全的建议和最佳实践。
|
11天前
|
监控 安全 网络安全
网络安全与信息安全:漏洞、加密与意识的交织
在数字时代的浪潮中,网络安全与信息安全成为维护数据完整性、保密性和可用性的关键。本文深入探讨了网络安全中的漏洞概念、加密技术的应用以及提升安全意识的重要性。通过实际案例分析,揭示了网络攻击的常见模式和防御策略,强调了教育和技术并重的安全理念。旨在为读者提供一套全面的网络安全知识框架,从而在日益复杂的网络环境中保护个人和组织的资产安全。
|
8天前
|
安全 网络安全 数据安全/隐私保护
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
在数字化时代,网络安全和信息安全已成为我们日常生活中不可或缺的一部分。本文将深入探讨网络安全漏洞、加密技术和安全意识等方面的问题,并提供一些实用的建议和解决方案。我们将通过分析网络攻击的常见形式,揭示网络安全的脆弱性,并介绍如何利用加密技术来保护数据。此外,我们还将强调提高个人和企业的安全意识的重要性,以应对日益复杂的网络威胁。无论你是普通用户还是IT专业人士,这篇文章都将为你提供有价值的见解和指导。
|
9天前
|
安全 算法 网络协议
网络安全与信息安全知识分享
本文深入探讨了网络安全漏洞、加密技术以及安全意识三个方面,旨在帮助读者更好地理解和应对网络安全威胁。通过分析常见的网络安全漏洞类型及其防范措施,详细介绍对称加密和非对称加密的原理和应用,并强调提高个人和企业安全意识的重要性,为构建更安全的网络环境提供指导。
24 2
|
9天前
|
安全 网络安全 数据安全/隐私保护
网络安全与信息安全:漏洞、加密与意识的艺术
在数字世界的迷宫中,网络安全和信息安全是守护者之剑。本文将揭示网络漏洞的面纱,探索加密技术的奥秘,并强调安全意识的重要性。通过深入浅出的方式,我们将一起走进这个充满挑战和机遇的领域,了解如何保护我们的数字身份不受威胁,以及如何在这个不断变化的环境中保持警惕和适应。
20 1
|
11天前
|
存储 安全 网络安全
云计算与网络安全:云服务、网络安全、信息安全等技术领域的融合与挑战
随着云计算技术的飞速发展,越来越多的企业和个人开始使用云服务。然而,云计算的广泛应用也带来了一系列网络安全问题。本文将从云服务、网络安全、信息安全等方面探讨云计算与网络安全的关系,分析当前面临的挑战,并提出相应的解决方案。
38 3
|
17天前
|
安全 算法 网络安全
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
在当今数字化时代,网络安全和信息安全已经成为了全球关注的焦点。随着技术的发展,网络攻击手段日益狡猾,而防范措施也必须不断更新以应对新的挑战。本文将深入探讨网络安全的常见漏洞,介绍加密技术的基本概念和应用,并强调培养良好安全意识的重要性。通过这些知识的分享,旨在提升公众对网络安全的认识,共同构建更加安全的网络环境。