真的非常简易,这个程序不过抓一些发送到本机的数据包,然后显示出来它们的一些信息罢了。

     程序很easy!

     

#include <WinSock2.h>
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#pragma comment(lib, "ws2_32.lib") /*链接ws2_32.lib动态链接库*/
#define SIO_RCVALL _WSAIOW(IOC_VENDOR, 1)
const int MAX_ADDR_LEN = 16; /*ip地址长度*/
const int MAX_HOSTNAME_LEN = 255; /*主机名称*/ /*WORD 16位 DWORD 32位*/
struct IPHeader {
BYTE HeaderLength : 4; //首部长度
BYTE Version : 4; //版本号
BYTE DS; //区分服务
WORD TotalLength; //总长度
WORD ID; //标识
BYTE FragmentOffset0 : 5; //片偏移
BYTE MF : 1; //MF标识
BYTE DF : 1; //DF标识
BYTE Reserved : 1; //保留标识
BYTE FragmentOffset1; //片偏移
BYTE TTL; //生存时间
BYTE Protocol; //协议
WORD Checksum; //检验和
DWORD SourceAddress; //源地址
DWORD DestinationAddress; //目的地址
}; struct TCPHeader {
WORD SourcePort; //源port
WORD DestinationPort; //目的port
DWORD SequenceNumber; //序号
DWORD AcknowledgmentNumber; //确认号
BYTE Reserved0 : 4; //保留字段第一部分
BYTE DataOffset : 4; //数据偏移
BYTE FIN : 1; //FIN标识
BYTE SYN : 1; //SYN标识
BYTE RST : 1; //RST标识
BYTE PSH : 1; //PSH标识
BYTE ACK : 1; //ACK标识
BYTE URG : 1; //URG标识
BYTE Reserved1 : 2; //保留字段第二部分
WORD Window; //窗体
WORD Checksum; //检验和
WORD UrgentPointer; //紧急指针
}; struct UDPHeader {
WORD SourcePort; //源port
WORD DestinationPort; //目的port
WORD Length; //长度
WORD Checksum; //检验和
}; void main()
{
SOCKET sock;
WSADATA wsd;
DWORD dwBytesRet;
unsigned int optval = 1;
int pCount = 0; sockaddr_in source, dest; char hostName[MAX_HOSTNAME_LEN]; char sourceIP[MAX_ADDR_LEN]; /*记录源ip地址*/
char destIP[MAX_ADDR_LEN]; /*记录目的ip地址*/
char recvBuff[65535] = { 0 }; WSAStartup(MAKEWORD(2, 1), &wsd); /*初始化*/
hostent *pHostent;
UDPHeader *pUdpheader; /*UDP头部*/
IPHeader *pIpheader; /*IP头部*/
TCPHeader *pTcpheader; /*TCP头部*/ if ((sock = socket(AF_INET, SOCK_RAW, IPPROTO_IP)) == SOCKET_ERROR)/*创建原始套接字*/
{
exit(-1);
} gethostname(hostName, MAX_HOSTNAME_LEN); //获取主机名称
pHostent = gethostbyname(hostName); //获取有关于本机信息的一个hostent结构体 sockaddr_in sa;
sa.sin_family = AF_INET;
sa.sin_port = htons(6000);
memcpy(&sa.sin_addr.S_un.S_addr, pHostent->h_addr_list[0], pHostent->h_length); bind(sock, (SOCKADDR *)&sa, sizeof(sa)); /*绑定套接字*/ if (WSAGetLastError() == 10013)
{
exit(1);
}
/************************************************************************/
/* The WSAIoctl function controls the mode of a socket.
*/
/************************************************************************/
/*这个函数主要用来设定一些參数,这里设定接收全部的数据包*/
WSAIoctl(sock, SIO_RCVALL, &optval, sizeof(optval), NULL, 0, &dwBytesRet, NULL, NULL); pIpheader = (IPHeader *)recvBuff; while (pCount < 1000)
{
memset(recvBuff, 0, sizeof(recvBuff));
recv(sock, recvBuff, sizeof(recvBuff), 0); /*接收数据包*/ source.sin_addr.S_un.S_addr = pIpheader->SourceAddress; /*数据包源地址*/
strncpy_s(sourceIP, inet_ntoa(source.sin_addr), MAX_ADDR_LEN); dest.sin_addr.S_un.S_addr = pIpheader->DestinationAddress; /*目的地址*/
strncpy_s(destIP, inet_ntoa(dest.sin_addr), MAX_ADDR_LEN); if (pIpheader->Protocol == IPPROTO_TCP) /*使用的是TCP协议*/
{
int dataLen;
pTcpheader = (TCPHeader *)(recvBuff + sizeof(IPHeader));
dataLen = (pIpheader->TotalLength -
(pIpheader->HeaderLength * 4 + pTcpheader->DataOffset * 4));//tcp可能存在扩展 if (dataLen == 0) break;
printf("---------------------TCP---------------------\n");
printf("数据包序号 : %d\n", pCount);
printf("数据包大小 : %d\n", dataLen);
printf("源IP地址 :%s\n", sourceIP);
/*ntohs(s表示short)即将16位的数从网络(network)字节序转换为主机(host)字节序*/
/*同理,ntohl(l表示long)即将32位的数从网络(network)字节序转换为主机(host)字节序*/
printf("源port :%d\n", ntohs(pTcpheader->SourcePort));
printf("目地ip地址 :%s\n", destIP);
printf("目的port :%d\n", ntohs(pTcpheader->DestinationPort));
printf(" IP头部大小:%d\n", pIpheader->HeaderLength * 4);
printf("TCP头部大小:%d\n", (pTcpheader->DataOffset) * 4);
Sleep(1000);/*假设不休眠一下的话,速度会很的快!*/
pCount++;
} if (pIpheader->Protocol == IPPROTO_UDP) //数据包使用UDP
{
pUdpheader = (UDPHeader *)(recvBuff + sizeof(IPHeader));
int dataLen;
dataLen = (pIpheader->TotalLength -
(pIpheader->HeaderLength * 4 + sizeof(UDPHeader)));//udp首部并没有扩展
if (dataLen == 0) break;
printf("---------------------UDP--------------------\n");
printf("数据包序号 : %d\n", pCount);
printf("数据包大小 : %d\n", dataLen); printf("源IP地址 :%s\n", sourceIP);
printf("源port :%d\n", ntohs(pUdpheader->SourcePort));
printf("目的IP地址 :%s\n", destIP);
printf("目的port :%d\n", ntohs(pUdpheader->DestinationPort));
printf("IP头部大小 :%d\n", (pIpheader->HeaderLength)* 4);
printf("UDP头部大小:%d\n", sizeof(UDPHeader));
Sleep(1000);//假设不休眠一下的话,速度会很的快!
pCount++;
} }/*while*/
system("pause");
}

简易的sniffer程序的更多相关文章

  1. 基于 libpcap库的sniffer程序

    基于 libpcap库的sniffer程序 Libpcap库是WireSharek和Tcpdump抓包程序的基础,利用libcap我们自己也可以实现自己的抓包程序,在网络上实时抓包分析,或者利用处理的 ...

  2. simple-todo: 一个简易的 todo 程序 - django版

    今天无意间看到  simple-todo: 一个简易的 todo 程序 - web.py 中文教程 ,然后发现竟然有好多的版本 http://simple-is-better.com/news/tag ...

  3. 如何用 Python 写一个简易的抽奖程序

    不知道有多少人是被这个头图骗进来的:) 事情的起因是这样的,上周有同学问小编,看着小编的示例代码敲代码,感觉自己也会写了,如果不看的话,七七八八可能也写的出来,但是一旦自己独立写一段程序,感觉到无从下 ...

  4. jpcap 配置方法,问题解决,模拟sniffer程序。(附JAVA程序,jar,dll包等环境)

    博文链接 http://www.cnblogs.com/xckk/p/4609444.html 一.   Eclipse环境下安装与配置Jpcap 相关源程序.jpcap jar包,dll包,帮助文档 ...

  5. C语言 linux环境基于socket的简易即时通信程序

    转载请注明出处:http://www.cnblogs.com/kevince/p/3891033.html      ——By Kevince 最近在看linux网络编程相关,现学现卖,就写了一个简易 ...

  6. [计算机网络]简易http server程序

    好久没输出了,知识还是要写下总结才能让思路更加清晰.最近在学习计算机网络相关的知识,来聊聊如何编写一个建议的HTTP服务器. 这个http server的实现源代码我放在了我的github上,有兴趣的 ...

  7. 一个简易的WebServer程序

    现在这个公司的it管理真不知道说什么了,我主要从事.net方向的开发,公司电脑配置还是win7了,可是自己没有安装iis的权限,it也拒绝安装,想玩玩web安全都不行.于是乎决定开发一个window ...

  8. 任务02——安装 Intellj IDEA,编写一个简易四则运算小程序,并将代码提交到 GitHub

    github地址:https://github.com/ErhuoHome/First.git 安装jdk与intellij idea没有太大问题,以前安装过eclipse 在程序方面,由于对真分数的 ...

  9. WCF 双向通讯实例-简易的聊天程序

    源码下载 程序分四个部分: 1.原理 使用WCF的nettcp绑定.nettcp绑定类似原来的RPC,即.net remoting,只是在WCF提供统一协定,同一服务可以拥有多种客户端. 2.代码展示 ...

随机推荐

  1. java读文件的几个类

    链接地址:http://blog.sina.com.cn/s/blog_407a68fc0100f628.html 最初Java是不支持对文本文件的处理的,为了弥补这个缺憾而引入了Reader和Wri ...

  2. 五张图概括 什么是 ASP 、 ASP.NET (Web Pages,Web Forms ,MVC )

    当你看懂下面这五张图,我相信你对于学习.NET Web开发路线将不陌生!                                               来源: http://www.w3 ...

  3. IntelliJ IDEA 控制台 乱码 有效解决办法

    在Run -> Edit Configuration -> 你的运行Server -> Startup/Connection -> Environment Variables ...

  4. 翻页采用jaxa

    <!-- 翻页采用jaxa --><script type="text/javascript">//class="page"下面的a被点 ...

  5. 我的Python成长之路---第三天---Python基础(11)---2016年1月16日(雾霾)

    三.深浅拷贝 在Python中将一个变量的值传递给另外一个变量通常有三种:赋值.浅拷贝以及深拷贝 讨论深浅拷贝之前我们把Python的数据类型分为基本数据类型包括数字.字符串.布尔以及None等,还有 ...

  6. [Unity 3D] Unity 3D 性能优化 (一)

    听到过很多用Unity 3D开发游戏的程序员抱怨引擎效率太低,资源占用太高,包括我自己在以往项目的开发中也头疼过.最近终于有了空闲,可以仔细的研究一下该如何优化Unity 3D下的游戏性能.其实国外有 ...

  7. 我的Python成长之路---第一天---Python基础(2)---2015年12月26日(雾霾)

    三.数据类型 Python基本类型(能够直接处理的数据类型有以下几种)主要有5种 1.整数(int) Python可以处理任意大小的整数,当然包括负整数,在程序中的表示方法和数学上的写法一模一样,例如 ...

  8. session临时文件存储路径

    今天把本地的项目部署到外网时,遇到个问题,使用session_start()时,提示****目录下的这个文件不存在,网上查了查,说我的根目录不存在,然后在php.ini文件里看了下session.sa ...

  9. 《音乐商店》第4集:自动生成StoreManager控制器

    一.自动生成StoreManager控制器 二.查看 StoreManager 控制器的代码 现在,Store Manager 控制器中已经包含了一定数量的代码,我们从头到尾重新过一下. 1.访问数据 ...

  10. 怎样用HTML5 Canvas制作一个简单的游戏

    原文连接: How To Make A Simple HTML5 Canvas Game 自从我制作了一些HTML5游戏(例如Crypt Run)后,我收到了很多建议,要求我写一篇关于怎样利用HTML ...