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

     程序很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. BZOJ 3391: [Usaco2004 Dec]Tree Cutting网络破坏( dfs )

    因为是棵树 , 所以直接 dfs 就好了... ---------------------------------------------------------------------------- ...

  2. POJ 3384 Feng Shui 凸包直径 + 半平面交

    G++一直没有过了 换成 C++果断A掉了...It's time to bet RP. 题意:给一个多边形,然后放进去两个圆,让两个圆的覆盖面积尽量最大,输出两个圆心的坐标. 思路:将多边形的边向里 ...

  3. jQuery如何设置自增自减值

    一直不是很记得jquery中怎么设置自增值,比如当点击按钮时 div在当前宽度基础上增加宽度100px,可以这样写: $('button.test').click(function(){ $('div ...

  4. Windows服务编程集合

    http://zyan.cc/windows_mstsc/ Optionname--Optionvalues描述 type=----own, share, interact, kernel, file ...

  5. JProtector 帮助文档

    一.应用加密 1.使用 JProtector在线 进行应用加密:使用浏览器访问 http://app.shuton.net/encryptjar, 点击 Browse 选择待加密的应用jar包.war ...

  6. 《UNIX环境高级编程》笔记--sync、fsync和fdatasync函数

    传统的UNIX实现在内核中设有缓冲区高速缓存或页面高速缓存,大多数磁盘 I/O都通过缓冲进行.当将数据写入文件时,内核通常先将该数据复制到其中一个缓冲区中,如果该缓冲区尚未写满,则并不将其排入输出队列 ...

  7. Android实现 再按一次退出 的三种方法 durationTime、timerTask 和Handler

    目前很多Android应用都会实现按返回键时提示“再按一次推退出” 在这篇文章中总结了各家的方法,一般都是监听Activity的onKeyDown 或者onBackPressed方法 方法一: 直接计 ...

  8. mysql之数据类型

    一.概述:  所谓建表,就是声明列的过程: 数据是以文件的形式放在硬盘中(也有放在内存里的) 列:不同的列类型占的空间不一样 选列的原则:够用又不浪费: 二.mysql的数据类型: 整形:Tinyin ...

  9. C# 课堂总结1-二进制转换

    一.目的:便于计算机表示,稳定性好,符合逻辑运算,真为1,假为0. 二.各进制表示方法: 2进制:0,1 8进制:0-7 16进制:0-9,A,B,C,D,E,F 二.转换方法: 1.各进制转换为10 ...

  10. jQuery Mobile 入门基础教程

    jQuery Mobile是jQuery在手机上和平板设备上的版本.jQuery Mobile 不仅会给主流移动平台带来jQuery核心库,而且会发布一个完整统一的jQuery移动UI框架. jQue ...