一、题目

网络嗅探器

二、环境

Win10    codeblocks

三、代码实现

WinPcap的安装教程

winpcap要在CB中使用,还需配置一些.h文件,请自行百度,百度上有。

请熟悉教材IP数据包的格式,以及头部协议部分。
代码如下:

#define HAVE_REMOTE//宏定义
#define LINE_LEN 16
#include "winsock.h"
#include <string.h>
#include "pcap.h"
#pragma comment(lib, "Ws2_32.lib")
typedef struct ip_address
{ //ip地址u_char b1;//u_char无符号charu_char b2;u_char b3;u_char b4;
} ip_address;typedef struct mac_address
{//mac地址u_char b1;u_char b2;u_char b3;u_char b4;u_char b5;u_char b6;
} mac_address;typedef struct ethe_header
{ //mac帧首部mac_address mac_dest_address;//目的地址mac_address mac_source_address;//源地址u_short ether_type;//长度或类型
} ethe_header;typedef struct ip_header
{ //ip地址首部u_char  ver_ihl;//版本号和头长度各占4位u_char  tos;//服务类型u_short tlen;//分组长度u_short identification;//分组标识,唯一标识发送的每一个数据报u_short flags_fo;//标志u_char  ttl;//生存时间,TTLu_char  proto;//协议可以是TCP,UDP,ICMP等u_short crc;//校验和ip_address  saddr;//源IP地址ip_address  daddr;//目的IP地址u_int   op_pad;// 选项与填充
} ip_header;typedef struct udp_header
{ //UPD首部u_short sport;//源端口号u_short dport;//目的端口号u_short len;//包长度u_short crc;//校验和
} udp_header;typedef struct tcp_header
{ //TCP首部u_short sport;//16位源端口号u_short dport;//16位目的端口号u_int num;//32位序列号u_int ack;//32位确认号u_short sum;//可能是包长度u_short windonw;//16位窗口大小u_short crc;//16位校验和u_short ugr;//16位紧急数据偏移量
} tcp_header;void packet_handler(u_char * param, const struct pcap_pkthdr * header, const  u_char *pkt_data);
char judge;
int length;
int main()
{pcap_if_t * alldevs, *device;//pcap_if是winpcap这个抓包框架中自带的函数库中的主要函数之一,用来描述一个网络设备结构,int i = 0;int iNum;u_int netmask;struct bpf_program fcode;//使用于pcap_compile,格式过滤pcap_t * adhandle;//libpcap函数库中pcap_t及pcap_dumper_t类型的数据结构char errbuf[PCAP_ERRBUF_SIZE];//修改这里可以更改捕获的数据包使用的协议类型char packet_filter[] = "(ip and udp) or (ip and tcp) or (ip and icmp)";if (pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL, &alldevs, errbuf) == -1){ //获取设备列表fprintf(stderr,"无法打开网络设备:%s\n", errbuf);return 1;}for (device = alldevs; device  != NULL; device = device->next){ //打印列表if (i == 0){printf("请按CTRL + C退出!\n\n");printf("网络设备如下:\n");}printf("%d. %s\n", ++i, device -> name);if (device->description)printf(" (%s)\n", device->description);elseprintf("没有设备描述信息!");}if (i == 0){printf("\n请先安装WinPcap!");return -1;}printf("请选择网络设备接口:(1 - %d):", i);scanf("%d", &iNum);getchar();if (iNum < 1 || iNum > i){printf("设备不存在!\n");pcap_freealldevs(alldevs);//不需要网卡列表时,释放设备列表return -1;}//跳转到已选设备for (device = alldevs, i = 0;i < iNum -1 ; device = device -> next,i++);// 打开适配器if ( (adhandle= pcap_open(device->name,  // 设备名65536,     // 要捕捉的数据包的部分// 65535保证能捕获到不同数据链路层上的每个数据包的全部内容PCAP_OPENFLAG_PROMISCUOUS,         // 混杂模式1000,      // 读取超时时间NULL,      // 远程机器验证errbuf     // 错误缓冲池) ) == NULL){fprintf(stderr,"\n不能打开适配器!\n");/* 释放设备列表 */pcap_freealldevs(alldevs);return -1;}if (pcap_datalink(adhandle) != DLT_EN10MB){ //检查数据链路层,为了简单,只考虑以太网fprintf(stderr, "\n系统网卡链路出错!\n");pcap_freealldevs(alldevs); //释放设备列表return -1;}if (device->addresses != NULL) //获得接口第一个地址的掩码netmask = ((struct sockaddr_in *)(device->addresses->netmask))->sin_addr.S_un.S_addr;else //如果接口没有地址,那么我们假设一个C类的掩码netmask = 0xffff00;if (pcap_compile(adhandle, &fcode, packet_filter, 1, netmask) < 0){ //编译过滤器fprintf(stderr, "不能监听过滤该数据报!\n");pcap_freealldevs(alldevs);return -1;}if (pcap_setfilter(adhandle, &fcode) < 0){ //设置过滤器fprintf(stderr, "过滤设置错误!\n");pcap_freealldevs(alldevs);return -1;}printf("请输入是否要输出捕捉到的报文信息(y/n) : ");scanf("%c",&judge);if (judge!='n'){printf("请输入要限制要输出报文信息长度(-1不限制) : ");scanf("%d",&length);}printf("\n正在监听通过%s的数据报...\n", device->description);pcap_freealldevs(alldevs); //释放设备列表pcap_loop(adhandle, 0, packet_handler, NULL); //开始捕捉return 0 ;
}void packet_handler(u_char *dumpfile, const struct pcap_pkthdr *header, const u_char *pkt_data)
{ //回调函数,当收到每一个数据包时会被libpcap所调用if(header->caplen>400) return;int len;struct tm *ltime;char timestr[16];ip_header * ip_hd;udp_header * udp_hd;tcp_header * tcp_hd;ethe_header * ethe_hd;int ip_len,tcp_len,start;u_short sport,dport;printf("\n");ltime=localtime(&header->ts.tv_sec); //将时间戳转换为可读字符strftime( timestr, sizeof timestr, "%H:%M:%S", ltime);printf("时间:%s\n",timestr);ethe_hd = (ethe_header *)pkt_data;ip_hd = (ip_header *)(pkt_data + 14);ip_len = (ip_hd ->ver_ihl & 0xf) * 4; //ip首部长度udp_hd = (udp_header *)((u_char *)ip_hd + ip_len);sport = ntohs(udp_hd->sport);dport = ntohs(udp_hd->dport);if(ip_hd->proto==17){printf("协议:UDP");start=ip_len+8;}else if(ip_hd->proto==6){printf("协议:TCP");tcp_hd = (tcp_header *)((u_char *)ip_hd + ip_len);tcp_len=ntohs(tcp_hd->sum)>>12;start=ip_len+tcp_len*4;}else if(ip_hd->proto==1){printf("协议:ICMP");start=ip_len+23;}else printf("协议:其他");printf("start=%d\n",start);printf("                      数据报的长度:%d\n",header->caplen);printf("IP头的长度:%d              IP包存活时间:%d\n",ip_hd->tlen,ip_hd->ttl);printf("源IP地址: %d.%d.%d.%d:%d      目的IP地址:%d.%d.%d.%d:%d\n      源端口:%d                     目的端口:%d\n源物理地址: %x-%x-%x-%x-%x-%x   目的物理地址:%x-%x-%x-%x-%x-%x\n",ip_hd->saddr.b1, ip_hd->saddr.b2, ip_hd->saddr.b3, ip_hd->saddr.b4,ip_hd->daddr.b1, ip_hd->daddr.b2, ip_hd->daddr.b3, ip_hd->daddr.b4, sport, dport,ethe_hd->mac_source_address.b1, ethe_hd->mac_source_address.b2, ethe_hd->mac_source_address.b3,ethe_hd->mac_source_address.b4, ethe_hd->mac_source_address.b5, ethe_hd->mac_source_address.b6,ethe_hd->mac_dest_address.b1, ethe_hd->mac_dest_address.b2, ethe_hd->mac_dest_address.b3,ethe_hd->mac_dest_address.b4, ethe_hd->mac_dest_address.b5, ethe_hd->mac_dest_address.b6);//输出数据部分if (judge=='y'){printf("数据部分内容为:\n");if(length==-1) len=(header->caplen) + 1 ;else len=(length>header->caplen + 1-start)?(header->caplen+1)-start:length;for (int i=start; (i < start + len ) ; i++){printf("%.2x ", pkt_data[i-1]); //也可以改为 %c 以 ascii码形式输出。if ( (i % LINE_LEN) == 0) printf("\n");}printf("\n\n");}
}

四、实验结果

计算机网络课程设计网络嗅探器相关推荐

  1. 计算机网络课程设计之网络嗅探器的设计与实现

    前言 本实验难点是在于Windows下的raw socket有太多的限制,因此用winpcap编程功能更加强大,但是根据指导书要求要用原始套接字,原始套接字在Linux系统下也十分强大,结尾附上Lin ...

  2. 计算机网络课程设计之网络代理服务器的设计与实现

    前言 本实验因为时间有限,写的比较草率... 白嫖容易,创作不易,本文原创,转载请注明!!! 源码和可运行程序: 链接:https://pan.baidu.com/s/1A9KctmpP2JJgyW2 ...

  3. 计算机网络课程设计之基于 IP 多播的网络会议程序

    前言 本实验难点在于环境的配置,尤其是多网卡配置,经过查阅资料和多次小伙伴们测试,最后终于找到问题的根源 问题分析和配置主要放在实验结果与分析栏中 结尾附上指导书的IP多播源码 白嫖容易,创作不易,本 ...

  4. 计算机网络课程设计之网络聊天程序的设计与实现

    前言 计算机网络课程设计开始,要求用C/C++,而且有些题目还要有图形界面,因此决定用Qt写图形界面,同时决定用一个程序完成所有的实验设计. 白嫖容易,创作不易,本文原创,转载请注明!!! 源码和可运 ...

  5. 计算机网络抓包参考文献,计算机网络课程设计二(网络抓包与分析)

    <计算机网络课程设计二(网络抓包与分析)>由会员分享,可在线阅读,更多相关<计算机网络课程设计二(网络抓包与分析)(9页珍藏版)>请在人人文库网上搜索. 1.课程设计课程名称: ...

  6. 计算机网络题简单建设校园网络,计算机网络课程设计—校园网络构建方案设计和实现.doc...

    计算机网络课程设计-校园网络构建方案设计和实现 <计算机网络>课程设计报告 题目:校园网络构建方案设计和实现 组别/组长: 专 业: 计算机网络技术 院 系: 信息工程学院 信息工程学院制 ...

  7. 计算机网络题简单建设校园网络,计算机网络课程设计校园网络构建方案设计和实现.doc...

    计算机网络课程设计校园网络构建方案设计和实现 <计算机网络>课程设计报告 题目:校园网络构建方案设计和实现 组别/组长: 专 业: 计算机网络技术 院 系: 信息工程学院 信息工程学院制目 ...

  8. 计算机网络设计校园网实验报告,计算机网络课程设计实验报告---校园网网络构建方案设计和实现...

    计算机网络课程设计实验报告---校园网网络构建方案设计和实现 计算机网络课程设计计算机网络课程设计 校园网网络构建方案设计和实现 一一. .实验实验题目题目 校园网网络构建方案设计与实现 二二. .实 ...

  9. h3c服务器操作系统微软彩盒,校园网络设计计算机网络课程设计.doc

    淮海工学院 计算机工程学院 课程设计报告 设计名称: 计算机网络课程设计 姓 名: 施晓霞 学 号: 2012130195 专业班级: D计算机121班 系 (院): 计算机工程学院 设计时间: 20 ...

最新文章

  1. 定制Eclipse IDE之界面篇
  2. ssm拼接html,SSM前后端分离 ssm+html+js(ajax) 这种controll层的返回值是结合或者网址...
  3. python中用str乘方_Python基础知识
  4. java客户端连接请求发不出去_java – Spring:客户端发送的请求在语法上不正确()...
  5. 索引大小对语句执行速度的影响
  6. 完善的IaaS云服务的个人理解
  7. 基于时间片的高优先级调度_CFS调度器(1)-基本原理
  8. 智慧交通信息服务平台产品解决方案
  9. 树莓派无线投屏服务器,树莓派 Raspberry Pi 设置无线上网
  10. Visio2013下载及激活破解工具
  11. HTTP协议之3XX状态码
  12. Docker安装ElasticSearch 版本7.6.2
  13. 深度剖析:针对深度学习的GPU共享
  14. 蓝屏出现STOP:0X00000077是什么原因造成
  15. C -CPT-SS-PDI 喜树碱-双硫键-聚苝酰亚胺/PEI-g–PLO 聚乙烯亚胺-聚L-鸟氨酸
  16. DSP TMS320C5509A 控制DDS AD9854芯片进行FSK调制
  17. linux samba文件共享,网络凭据总是出错解决方法
  18. ruby的require, 和in clude有什么区别
  19. 【全局面包屑导航】依据路由动态生成面包屑导航
  20. 微信看看对方是不是把你删除了

热门文章

  1. M.2接口固态硬盘安装WIN7系统
  2. E440 固态硬盘装Win7
  3. 老方块 oracle培训,老方块Oracle 11g培训新版小学班 SQL 完整35课 星爷版 OCA OCP
  4. 关于win7开热点的一些小备忘
  5. Linux 驱动 | hy46xx触摸屏驱动
  6. Vue源码解析之Template转化为AST的实现方法
  7. 2023上海师范大学计算机考研信息汇总
  8. TKO 6-1 DP入门之1058(寻找第n个因数只有2、3、5、7的数字)
  9. mysql 数据泵_数据泵导出/导入数据
  10. 不知道今天吃什么?今天吃什么 API 告诉你