计算机网络课程设计网络嗅探器
一、题目
网络嗅探器
二、环境
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");}
}
四、实验结果
计算机网络课程设计网络嗅探器相关推荐
- 计算机网络课程设计之网络嗅探器的设计与实现
前言 本实验难点是在于Windows下的raw socket有太多的限制,因此用winpcap编程功能更加强大,但是根据指导书要求要用原始套接字,原始套接字在Linux系统下也十分强大,结尾附上Lin ...
- 计算机网络课程设计之网络代理服务器的设计与实现
前言 本实验因为时间有限,写的比较草率... 白嫖容易,创作不易,本文原创,转载请注明!!! 源码和可运行程序: 链接:https://pan.baidu.com/s/1A9KctmpP2JJgyW2 ...
- 计算机网络课程设计之基于 IP 多播的网络会议程序
前言 本实验难点在于环境的配置,尤其是多网卡配置,经过查阅资料和多次小伙伴们测试,最后终于找到问题的根源 问题分析和配置主要放在实验结果与分析栏中 结尾附上指导书的IP多播源码 白嫖容易,创作不易,本 ...
- 计算机网络课程设计之网络聊天程序的设计与实现
前言 计算机网络课程设计开始,要求用C/C++,而且有些题目还要有图形界面,因此决定用Qt写图形界面,同时决定用一个程序完成所有的实验设计. 白嫖容易,创作不易,本文原创,转载请注明!!! 源码和可运 ...
- 计算机网络抓包参考文献,计算机网络课程设计二(网络抓包与分析)
<计算机网络课程设计二(网络抓包与分析)>由会员分享,可在线阅读,更多相关<计算机网络课程设计二(网络抓包与分析)(9页珍藏版)>请在人人文库网上搜索. 1.课程设计课程名称: ...
- 计算机网络题简单建设校园网络,计算机网络课程设计—校园网络构建方案设计和实现.doc...
计算机网络课程设计-校园网络构建方案设计和实现 <计算机网络>课程设计报告 题目:校园网络构建方案设计和实现 组别/组长: 专 业: 计算机网络技术 院 系: 信息工程学院 信息工程学院制 ...
- 计算机网络题简单建设校园网络,计算机网络课程设计校园网络构建方案设计和实现.doc...
计算机网络课程设计校园网络构建方案设计和实现 <计算机网络>课程设计报告 题目:校园网络构建方案设计和实现 组别/组长: 专 业: 计算机网络技术 院 系: 信息工程学院 信息工程学院制目 ...
- 计算机网络设计校园网实验报告,计算机网络课程设计实验报告---校园网网络构建方案设计和实现...
计算机网络课程设计实验报告---校园网网络构建方案设计和实现 计算机网络课程设计计算机网络课程设计 校园网网络构建方案设计和实现 一一. .实验实验题目题目 校园网网络构建方案设计与实现 二二. .实 ...
- h3c服务器操作系统微软彩盒,校园网络设计计算机网络课程设计.doc
淮海工学院 计算机工程学院 课程设计报告 设计名称: 计算机网络课程设计 姓 名: 施晓霞 学 号: 2012130195 专业班级: D计算机121班 系 (院): 计算机工程学院 设计时间: 20 ...
最新文章
- 定制Eclipse IDE之界面篇
- ssm拼接html,SSM前后端分离 ssm+html+js(ajax) 这种controll层的返回值是结合或者网址...
- python中用str乘方_Python基础知识
- java客户端连接请求发不出去_java – Spring:客户端发送的请求在语法上不正确()...
- 索引大小对语句执行速度的影响
- 完善的IaaS云服务的个人理解
- 基于时间片的高优先级调度_CFS调度器(1)-基本原理
- 智慧交通信息服务平台产品解决方案
- 树莓派无线投屏服务器,树莓派 Raspberry Pi 设置无线上网
- Visio2013下载及激活破解工具
- HTTP协议之3XX状态码
- Docker安装ElasticSearch 版本7.6.2
- 深度剖析:针对深度学习的GPU共享
- 蓝屏出现STOP:0X00000077是什么原因造成
- C -CPT-SS-PDI 喜树碱-双硫键-聚苝酰亚胺/PEI-g–PLO 聚乙烯亚胺-聚L-鸟氨酸
- DSP TMS320C5509A 控制DDS AD9854芯片进行FSK调制
- linux samba文件共享,网络凭据总是出错解决方法
- ruby的require, 和in clude有什么区别
- 【全局面包屑导航】依据路由动态生成面包屑导航
- 微信看看对方是不是把你删除了