参照附录 4 raw socket 编程例子,设计一个可以监视网络的状态、数据流动情况以及网络上传输 的信息的网络嗅探器。
显示了流量信息,若要查看报文信息请修改注释。
自动获取ip

#include <iostream>
#include <winsock2.h>
#include <time.h>
#pragma comment(lib, "WS2_32")
using namespace std;void DecodeIPPacket(char *pData);void DecodeTCPPacket(char *pData);void DecodeUDPPacket(char *pData);void DecodeICMPPacket(char *pData);#define SIO_RCVALL            _WSAIOW(IOC_VENDOR,1)
double all=0;
/*****IP分组首部结构******/
//IP首部结构
typedef struct _IPHeader {unsigned char iphVerLen; // 版本号和头长度各占4位unsigned char ipTOS;  // 服务类型unsigned short ipLength; // 分组总长度unsigned short ipID; //分组标识,惟一标识发送的每一个数据报unsigned short ipFlags; // 标志unsigned char ipTTL; // 生存时间,TTLunsigned char ipProtocol; // 协议可以是TCP、UDP、ICMP等unsigned short ipChecksum; // 校验和unsigned long ipSource; // 源IP地址unsigned long ipDestination; // 目的IP地址
} IPHeader, *PIPHeader;//ICMP报头结构******/
typedef struct icmphdr {char i_type;  //8 位类型字段char i_code;  //8 位代码字段unsigned short i_cksum;  //16位校验和unsigned short i_id;    //标识符,一般可设为发送进程的IDunsigned short i_seq;   //序列号unsigned long timestamp;  //时间戳
} ICMPHeader;//UDP报头结构
typedef struct _UDPHeader {unsigned short sourcePort;    // 源端口号unsigned short destinationPort; // 目的端口号unsigned short len;          // 包长度unsigned short checksum;    // 校验和
} UDPHeader;//TCP报头结构
typedef struct _TCPHeader {unsigned short sourcePort;        // 16位源端口号unsigned short destinationPort;    // 16位目的端口号unsigned long sequenceNumber;    // 32位序列号unsigned long acknowledgeNumber;    // 32位确认号char dataoffset;    //高4位表示数据偏移char flags;    //低6位为URG、ACK、PSH、RST、SYNhe FIN六个标志位unsigned short windows;        // 16位窗口大小unsigned short checksum;        // 16位校验和unsigned short urgentPointer;        // 16位紧急数据偏移量
} TCPHeader;int main() {setvbuf(stdout, NULL, _IONBF, 0);WSADATA wsaData;                              // 用来存储被WSAStartup函数调用后返回的Windows Sockets数据WSAStartup(MAKEWORD(2, 2), &wsaData);     // 完成对Winsock服务的初始化/**** 创建原始套节字 IPv4 TCP******/SOCKET sRaw = socket(PF_INET, SOCK_RAW, 0);SOCKADDR_IN addr_in;                            // 目的地址/*****输入想要要监听的接口的IP地址******///cout << "请输入要监听接口的IP地址:";char snfIP[20];//cin.getline(snfIP, sizeof(snfIP));char hostname[256];gethostname(hostname,sizeof(hostname));   //获取主机信息HOSTENT* host=gethostbyname(hostname);strcpy(snfIP,inet_ntoa(*(in_addr*)*host->h_addr_list));     //copy主机信息中的ip到snfIPaddr_in.sin_family = AF_INET;                       // IPv4addr_in.sin_port = htons(80);            // 80端口addr_in.sin_addr.S_un.S_addr = inet_addr(snfIP);    // 监听的地址/****绑定网卡IP地址******/bind(sRaw, (PSOCKADDR) &addr_in, sizeof(addr_in));/****在调用ioctlsocket将网卡设为混杂模式前,套节字必须绑定该网卡的IP地址******/DWORD dwValue = 1;// 套接字 SIO_RCVALL操作为所有的IP包无论经不经过ioctlsocket(sRaw, SIO_RCVALL, &dwValue);// 开始抓取IP分组char buff[50][4096];int packetNumber;int time=0;while (1) {long t=clock();double v=0.0;recv(sRaw, buff[0], 4096, 0);//cout << endl;DecodeIPPacket(buff[0]);//解析IP包//cout <<clock()-t<< endl;time+=clock()-t;if(time>1000){v=all/1024;//cout <<all<<"Bytes/s"<< endl;printf("%.02fKB/s\n",v);all=0;time=0;}//v=(all-a)/((clock()-t)*1000);//cout <<v <<"bytes/s"<< endl;}closesocket(sRaw);WSACleanup();return 0;
}
/**********IP分组解析函数*************/
void DecodeIPPacket(char *pData) {int n = 0;IPHeader *pIPHdr = (IPHeader *) pData;// 源地址和目的地址in_addr source, dest;char szSourceIp[32], szDestIp[32];/***从IP头中取出源IP地址和目的IP地址***/source.S_un.S_addr = pIPHdr->ipSource;          // 设置源地址dest.S_un.S_addr = pIPHdr->ipDestination;       // 设置目的地址strcpy(szSourceIp, inet_ntoa(source));strcpy(szDestIp, inet_ntoa(dest));/* cout << "源IP:" << szSourceIp;cout << "目的IP: " << szDestIp << endl;*/int nHeaderLen = (pIPHdr->iphVerLen & 0xf) * sizeof(ULONG);// IP头长度// cout << "大小:" << ntohs(pIPHdr->ipLength) << endl;all+=ntohs(pIPHdr->ipLength);switch (pIPHdr->ipProtocol) // 协议{case IPPROTO_TCP: // 调用函数解析TCP包DecodeTCPPacket(pData + nHeaderLen);break;case IPPROTO_UDP:// 调用函数解析UDP包DecodeUDPPacket(pData + nHeaderLen);break;case IPPROTO_ICMP:// 调用函数解析ICMP包DecodeICMPPacket(pData + nHeaderLen);break;default:cout << " 协议号:" << (int) pIPHdr->ipProtocol << endl;}
}/*********TCP包解析函数***********/
void DecodeTCPPacket(char *pData) {TCPHeader *pTCPHdr = (TCPHeader *) pData;/*cout << "TCP Source Port: " << ntohs(pTCPHdr->sourcePort);cout << "  Destination Port: " << ntohs(pTCPHdr->destinationPort) << endl;cout << pTCPHdr ->windows<<endl;*/}/***********UDP包解析函数**********/
void DecodeUDPPacket(char *pData) {UDPHeader *pUDPHdr = (UDPHeader *) pData;/* cout << "UDP Source Port: " << ntohs(pUDPHdr->sourcePort);cout << "  Destination Port: " << ntohs(pUDPHdr->destinationPort) << endl;*///cout << ntohs(pUDPHdr ->len)<<endl;
}/***********ICMP包解析函数 **********/
void DecodeICMPPacket(char *pData) {ICMPHeader *pICMPHdr = (ICMPHeader *) pData;cout << "ICMP Type: " << pICMPHdr->i_type << "Code: " << pICMPHdr->i_code << endl;switch (pICMPHdr->i_type) {case 0:cout << "Echo Response.\n";break;case 8:cout << "Echo Request.\n";break;case 3:cout << "Destination Unreachable.\n";break;case 11:cout << "Datagram Timeout(TTL=0).\n";break;}
}``

计网实验c/c++、网络嗅探器的设计与实现相关推荐

  1. (计网实验1)HTTP 代理服务器的设计与实现

    目录 教训 参考知识 代理服务器定义 代理服务器原理 单用户代理服务器 多用户代理服务器 实验目的 实验内容 实验过程 设置浏览器代理 实现一个基本的HTTP代理服务器 Cache功能 实现扩展功能 ...

  2. 【计网实验——prj4】广播网络实验

    [计网实验--prj4]广播网络实验 实验要求 1. 实现节点广播的broadcast_packet函数 2. 验证广播网络能够正常运行 • 从一个端节点ping另一个端节点 3. 验证广播网络的效率 ...

  3. 2020计网实验报告

    title: 计网实验报告 date: 2020-12-13 16:31:07 tags: *实验名称* 实验1 WireShark的使用 *实验时间* 2020年10月7日 10:00-11:40时 ...

  4. java 柱状图jar_GitHub - mafulong/NetworkExper: 计网实验,抓包,java,jigloo界面开发,柱状图,文件自定义保存...

    jiWangShiYanByJava 计网实验,抓包,java,jigloo界面开发,柱状图,文件自定义保存 基于Winpcap的网络流量统计分析系统的设计与实现 一.实验内容描述 本实验是用java ...

  5. BUAA 计网实验笔记 3

    BUAA 计网实验笔记 3 -第三周网络层实验 这周实验还是挺繁琐的,尤其是VLAN间通信,重点理解一下.要不然你可能也像我一样,实验4小时 实验(1) ARP分析 ARP协议是用来建立mac地址和i ...

  6. BUAA 计网实验笔记 1

    BUAA 计网实验笔记 1 ​ - 第一周网络实验入门 尽管笔者事先预习了相关实验内容,但是,还是做了2小时的实验. (流下憨憨的眼泪,特此记录一下,后来者可留心注意下) 问题1:设备认知 在线实验平 ...

  7. 【计网实验——prj9】路由器转发实验

    [计网实验--prj9]路由器转发实验 实验要求 实验内容一 运行给定网络拓扑(router_topo.py) 在r1上执行路由器程序./router,进行数据包的处理 在h1上进行ping实验 Pi ...

  8. 【计网实验——prj6】生成树机制实验

    [计网实验--prj6]生成树机制实验 实验要求 1. 基于已有代码,实现生成树运行机制,对于给定拓扑(four_node_ring.py),计算输出相应状态下的最小生成树拓扑; 2. 自己构造一个不 ...

  9. 云南大学软件学院java实验九_云南大学 软件学院 计网实验

    <云南大学 软件学院 计网实验>由会员分享,可在线阅读,更多相关<云南大学 软件学院 计网实验(6页珍藏版)>请在人人文库网上搜索. 1.云南大学软件学院实 验 报 告课程: ...

  10. 3服务器是否明确返回了文件内容,云南大学软件学院计网实验2.doc

    云南大学软件学院计网实验2 云南大学软件学院 实 验 报 告 课程: 计算机网络原理实验 任课教师: 姓名: 学号: 专业: 成绩: 实验二.应用层协议分析实验报告 启动Ethereal分组俘获器.开 ...

最新文章

  1. 常用rsync命令操作梳理
  2. hdu2492 数状数组或者线段树
  3. 完全用Linux工作,抛弃windows
  4. 兼顾隐私与权利,华为以“科技有道”,实现“隐私无价”
  5. 详解Django中Request对象的相关用法
  6. linux如何手动释放内存吗,Linux如何手动清理内存中cache信息
  7. pytorch学习——基本优化思想与最小二乘法
  8. 线段树(单点更新) HDOJ 4288 Coder
  9. 乐橙tp1 html调用,乐橙TP1的妙用
  10. 互联网日报 | 2月8日 星期一 | 乐视回应App图标“欠122亿”;中国联通成立联通数科;高德地图上线13万个旅游厕所信息...
  11. NOIP模拟 字符处理(送分or送命?)
  12. Python打开电脑文件夹
  13. angular学习-数据绑定
  14. 云计算学习4——Nova组件服务
  15. [AV1] AV1 Specification
  16. 干起来,你就超过了 50% 的人
  17. 《数字进化论——2020中国企业服务数字智能生态白皮书》发布预告
  18. 【MFC_消息】WM_DRAWITEM与DrawItem()的讨论
  19. 快速上手JVM系列(整合篇)
  20. 三星三防s8计算机功能在哪里,三星Galaxy S8防水性能怎么样 三星S8防水介绍【图文详解】...

热门文章

  1. Kotlin小知识之高阶函数
  2. Java Pitfalls读书笔记1(语法)
  3. c4d启动无反应_软启动器维修常见的故障问题和处理办法
  4. 【华为认证-每日十题】HCNP-RS-IENP(1-10)【问】
  5. 动态规划学习-【国王和金矿】
  6. solr之使用IKAnalyzer配置同义词,停止词,扩展词。
  7. 上海大学2020计算机考研专业,2020上海大学计算机考研大纲
  8. wps 无法保存html数据,WPS2012保存网页内容怎么用
  9. 8口短信猫设备支持的短信猫软件丰富可满足多种应用需求
  10. python练习-字符串加密解密