版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、#include "stdafx.h"#include "stdio.h"#include "string.h"#include "mstcpip.h"#include "Winsock2.h"#pragma comment(lib,"WS2_32.lib")#define STATUS_FAILED 0xFFFF /定义异常出错代码#define MAX_P
2、ACK_LEN 65535 /接收的最大IP 报文#define MAX_ADDR_LEN 16 /点分十进制地址的最大长度#define MAX_HOSTNAME_LAN 255 /最大主机名长度typede
3、f struct _iphdr /定义IP首部 unsigned char h_lenver; /4 位首部长度+4 位IP 版本号 unsigned char tos;
4、60; /8 位服务类型TOS unsigned short total_len; /16 位总长度(字节) unsigned short ident; /16 位标识 unsigned short frag_and_flags;
5、; /3 位标志位 unsigned char ttl; /8 位生存时间TTL unsigned char proto; /8 位协议(TCP 或其他) unsigned short checksum;
6、 /16 位IP 首部校验和 unsigned int sourceIP; /32 位源IP 地址 unsigned int destIP; /32 位目的IP 地址
7、IP_HEADER;typedef struct _tcphdr /定义TCP 首部 USHORT th_sport; /16 位源端口 USHORT th_dport;
8、60; /16 位目的端口 unsigned int th_seq; unsigned int th_ack; unsigned char th_lenres; /4 位首部长度/6 位保留字 unsigned char th_flag; /6 位标志位
9、 USHORT th_win; /16 位窗口大小 USHORT th_sum; /16 位校验和 USHORT th_urp; &
10、#160; /16 位紧急数据偏移量TCP_HEADER;SOCKET SockRaw; char* TcpFlag6= /定义TCP 标志位 "FIN ",
11、; /FIN: 表示发送端已经没有数据要求传输了,希望释放连接。 "SYN ", /SYN: 标志位用来建立连接,让连接双方同步序列号。如果SYN1而ACK=0,则表示该数据包为连接请求,如果SYN=1而ACK=1则表示接受连接。 "RST ",
12、; /RST: 用来复位一个连接。RST标志置位的数据包称为复位包。一般情况下,如果TCP收到的一个分段明显不是属于该主机上的任何一个连接,则向远端发送一个复位包。 "PSH ", /PSH: 如果置位,接收端应尽快把数据传送给应用层。 &
13、#160;"ACK ", /ACK: 为确认标志位。如果为1,表示包中的确认号时有效的。否则,包中的确认号无效。 "URG " /URG: 为紧急数据标志。如果它为1,表示本数据包中包含紧急数据
14、。此时紧急数据指针有效。 bool ParamTcp =true; / -t 关注TCP 报文char *strFromIpFilter=NULL; / 源IP 地址过滤char *strDestIpFilter=NULL;
15、; / 目的地址过滤/Referrenceint DecodeIpPack(char *,int);int DecodeTcpPack(char *);void CheckSockError(int,char*);void usage(void);bool GetCmdLine(int, char *);/void main(int argc, char * argv) int iErrorCode; char RecvBufMAX_PACK_LEN = 0
16、 ; usage(); if(GetCmdLine(argc, argv)=true) exit(0); /初始化SOCKET WSADATA wsaData; iErrorCode = WSAStartup(MAKEWORD(2,1),&wsaData); CheckSockError(iErrorCode, "WSAStartup"); SockRaw = socket(AF_INET , SOCK_RAW , IPPROTO_IP); CheckSockEr
17、ror(SockRaw, "socket"); /获取本机IP 地址 char FAR nameMAX_HOSTNAME_LAN; iErrorCode = gethostname(name, MAX_HOSTNAME_LAN); CheckSockError(iErrorCode, "gethostname"); struct hostent FAR * pHostent; pHostent = (struct hostent * )malloc(sizeof(struct hostent);
18、 pHostent = gethostbyname(name); SOCKADDR_IN sa; sa.sin_family = AF_INET; sa.sin_port = htons(6000); memcpy(&sa.sin_addr.S_un.S_addr, pHostent->h_addr_list0, pHostent->h_length); iErrorCode = bind(SockRaw, (PSOCKADDR)&sa, sizeof(sa); CheckSockError(iE
19、rrorCode, "bind"); /设置SOCK_RAW 为SIO_RCVALL,以便接收所有的IP 包 DWORD dwBufferLen10 ; DWORD dwBufferInLen = 1 ; DWORD dwBytesReturned = 0 ; iErrorCode=WSAIoctl(SockRaw, SIO_RCVALL, &dwBufferInLen,
20、0; sizeof(dwBufferInLen), &dwBufferLen, sizeof(dwBufferLen), &dwBytesReturned, NULL, NU
21、LL ); CheckSockError(iErrorCode, "Ioctl"); /侦听IP 报文 while(true) memset(RecvBuf, 0, sizeof(RecvBuf); iErrorCode = recv(SockRaw, RecvBuf, sizeof(RecvBuf), 0); CheckSockError(iErrorCode, "recv"); iErrorCode = DecodeIpP
22、ack(RecvBuf, iErrorCode); CheckSockError(iErrorCode, "Decode"); /IP 解包程序int DecodeIpPack(char *buf, int iBufSize) IP_HEADER *pIpheader; int iProtocol, iTTL; char szProtocol4; char szSourceIPMAX_ADDR_LEN, szDestIPMAX_ADDR_LEN; SOCKADDR_IN saSource,
23、saDest; pIpheader = (IP_HEADER *)buf; /Check Proto iProtocol = pIpheader->proto; strncpy(szProtocol, "TCP", 4); if(iProtocol=IPPROTO_TCP) /Check Source IP saSource.sin_addr.s_addr = pIpheader->sourceIP; strncpy(szSourceI
24、P, inet_ntoa(saSource.sin_addr), MAX_ADDR_LEN); if (strFromIpFilter) if (strcmp(strFromIpFilter,szSourceIP) return true; /Check Dest IP saDest.sin_addr.s_addr = pIpheader->destIP; strncpy(szDestIP, inet_ntoa(saDe
25、st.sin_addr), MAX_ADDR_LEN); if (strDestIpFilter) if (strcmp(strDestIpFilter,szDestIP) return true; /TTL iTTL = pIpheader->ttl; /Output printf("%s ", szProtocol); printf("%s-&g
26、t;%s ", szSourceIP, szDestIP); printf("bytes=%d TTL=%d ",iBufSize,iTTL); /Calculate IP Header Length int iIphLen = sizeof(unsigned long) * (pIpheader->h_lenver & 0xf); /Decode Sub Protocol:TCP DecodeTcpPack(buf+iIphLen);
27、60; return true;/SOCK 错误处理程序void CheckSockError(int iErrorCode, char *pErrorMsg) if(iErrorCode=SOCKET_ERROR) printf("%s Error:%dn", pErrorMsg, GetLastError(); closesocket(SockRaw); exit(0); /TCP 解包程序int DecodeTcpPack(char * TcpBuf)
28、;TCP_HEADER * pTcpHeader; pTcpHeader = (TCP_HEADER * )TcpBuf; printf("Port:%d->%d ", ntohs(pTcpHeader->th_sport),ntohs(pTcpHeader->th_dport); unsigned char FlagMask = 1; int HdrLen = (pTcpHeader->th_lenres)>>2; printf("n%s",(BYTE *)pTcpH
29、eader)+HdrLen); for( int i=0; i<6; i+ ) if(pTcpHeader->th_flag) & FlagMask) printf("%s",TcpFlagi); else printf(" "); FlagMask=FlagMask<<1; printf("n"); return
30、 true;/命令行参数处理bool GetCmdLine(int argc, char * argv) for(int i=1;i<argc;i+) if(argvi0!='/') return true; else switch (argvi1) case 'f': c
31、ase 'F': strFromIpFilter=(char*)malloc(16*sizeof(char); memset(strFromIpFilter,0,16*sizeof(char); strcpy(strFromIpFilter,argvi+3);
32、60; break; case 'd': case 'D': strDestIpFilter=(char*)malloc(16*sizeof(char); memset(strDestIpFilter,0,16*sizeof(char); &
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 档案托管合同范本
- 代理电子合同范本
- 农业招标合同范本
- 齐齐哈尔大学《马克思主义经典著作选读》2023-2024学年第一学期期末试卷
- 齐齐哈尔大学《教师职业道德》2022-2023学年第一学期期末试卷
- 钢化玻璃购销协议2024细则
- 2024年销售代表授权协议样本文件
- 2024届甘肃省天水市高中名校高三下学期5月联考数学试题试卷
- 草拟合同范本
- 货款抵押货物合同范本格式
- 2024年 贵州茅台酒股份有限公司招聘笔试参考题库含答案解析
- 2024年华融实业投资管理有限公司招聘笔试参考题库含答案解析
- 2024年1月普通高等学校招生全国统一考试适应性测试(九省联考)历史试题(适用地区:贵州)含解析
- 儿童心理健康问题的评估与干预方案
- NB-T 47013.7-2012(JB-T 4730.7) 4730.7 承压设备无损检测 第7部分:目视检测
- 空气化工高精度气体分装及储运中心一期项目环评报告书
- 肝吸虫护理查房课件
- 社区工作者案件调解流程
- 学校监控使用安全应急预案
- 汽车构造复习
- 【酒店人力资源管理问题研究文献综述3000字】
评论
0/150
提交评论