设为主页 | 加入收藏 | 繁體中文

在局域网进行IP包捕获的一种方法

  首先是几个结构的界说(网上搜刮大概查阅相关文档):
  //界说IP地址结构
  struct IPADDRESS
  {
  unsigned short ip_a,
  ip_b,
  ip_c,
  ip_d;
  };
  //界说IP数据包头的结构
  struct IP_HEADER
  {
  unsigned short   ip_version,   /*IP的版本号 */
  ip_hdr_len,   /*IP包头的长度*/
  ip_tos,       /*IP包的服务类型*/
  ip_total_len,   /*IP包的总长度*/
  ip_id,       /*IP包的分段标识*/
  ip_flags,     /*IP包的分段标记*/
  ip_frag_offset,   /*IP包的分段偏移*/
  ip_ttl,       /*IP包的生活时间*/
  ip_proto,     /*IP包的高层协议*/
  ip_hdr_chksum;   /*IP包的校验和*/
  struct IPADDRESS   ip_src_addr,   /*IP包的源IP地址*/
  ip_dest_addr;   /*IP包的目的IP地址*/
  }ipheader;
  //IP包的链表结构
  struct stru_ip_link
  {
  char rcv_ip_buf[MAX_IP_SIZE];
  struct stru_ip_link *next;
  };
  然后是协议的界说(包罗相应的头文件#include #include):
  DWORD dwIoControlCode=SIO_RCVALL,   /*接收所有的IP包*/
  dwProtocol=IPPROTO_IP;   /*协议类型为IP*/
  然后是相应的捕获处理:
  1.加载 Winsock;
  2.创建一个接收原始IP包的socket毗连;
  3.绑定到一个接口;
  4.举行WSAIoctl设置,接收所有的IP数据包。
  参考代码:
  if (WSAIoctl(s, dwIoControlCode, &optval, sizeof(optval),
  NULL, 0, &dwBytesRet, NULL, NULL) == SOCKET_ERROR)
  ...
  5.接着设定一个线程举行捕获:
  (1)创建一个接收IP包的链表头;
  (2)设置一个标识,为真,则不断举行IP包的捕获;
  (3)创建一个新的结点,将捕获的数据包参加到该结点;
  (4)要是链表的长度达到指定的长度,创建一个线程对该链表的IP包举行剖析;再设置一个在IP数据包链表不足给定的长度,而又中止IP捕获时,对链表的处理;
  (5)为下一个IP包链表创建一个链表头。
  6.创建一个举行IP包剖析并表现的线程,举行剖析IP数据包,然后表现IP数据包。
 


    文章作者: 福州军威计算机技术有限公司
    军威网络是福州最专业的电脑维修公司,专业承接福州电脑维修、上门维修、IT外包、企业电脑包年维护、局域网网络布线、网吧承包等相关维修服务。
    版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章原始出处 、作者信息和声明。否则将追究法律责任。

TAG:
评论加载中...
内容:
评论者: 验证码: