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

     程序很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. 设计模式 - 单例模式mysql数据库操作类

    待续... index.php 调用方法: <?php header('Content-Type:text/html; charset=utf8'); require 'instance.php ...

  2. 素数环(C - 暴力求解)

    素数环(暴力)(紫书194页) Description   A ring is composed of n (even number) circles as shown in diagram. Put ...

  3. Codeforces Round #315 (Div. 2B) 569B Inventory 贪心

    题目:Click here 题意:给你n,然后n个数,n个数中可能重复,可能不是1到n中的数.然后你用最少的改变数,让这个序列包含1到n所有数,并输出最后的序列. 分析:贪心. #include &l ...

  4. BZOJ 2631: tree( LCT )

    LCT...略麻烦... -------------------------------------------------------------------------------- #inclu ...

  5. 如何设置gen_server在退出时执行相关操作

    如果gen_server在监控树中不需要stop函数,gen_server会由其supervisor根据shutdown策略自动终止掉.如果要在进程终止之前执行清理,shutdown策略必须设定一个t ...

  6. Android的ProgressBar

    注意点: 必须在setContentView 前面设置,否则会报错. 重要的方法: progress.incrementProgressBy(int diff);//参数为进度数,进度满了为100.不 ...

  7. PHP缓存主要技术

    1.普遍缓存技术: 数据缓存:这里所说的数据缓存是指数据库查询PHP缓存机制,每次访问页面的时候,都会先检测相应的缓存数据是否存在,如果不存在,就连接数据库,得到数据,并把查询结果序列化后保存到文件中 ...

  8. django中上传图片的写法

    view参数 @csrf_exemptdef before_upload_avatar(request):    before = True    return render_to_response( ...

  9. php 原生或curl获取 http headers

    有一个函数: array get_headers ( string $url [, int $format = 0 ] ) Parameters url The target URL. format ...

  10. UNIX环境高级编程——进程管理和通信(总结)

    进程管理与通信 进程的管理 进程和程序的区别: 进程: 程序的一次执行过程   动态过程,进程的状态属性会发生变化 程序:存放在磁盘上的指令.数据的有序集合  是个文件,可直观看到 程序program ...