网站风格分类,传媒视频软件下载网站,怎么做网站推广林芝地区,巩义便宜网站建设费用例如我现在发表了一个帖子#xff0c;点击提问按钮#xff0c;我如何截获点击提问按钮时所发出去的包呢#xff1f;并把我发表的内容取出来。 --------------------------------------------------------------- -------------------------------------------------------…例如我现在发表了一个帖子点击提问按钮我如何截获点击提问按钮时所发出去的包呢并把我发表的内容取出来。 --------------------------------------------------------------- --------------------------------------------------------------- 选自小猪的Blog 一捕获数据包的实现原理 二捕获数据包的编程实现 1 raw socket的实现方法 2 Winpcap的实现方法 a. 枚举本机网卡的信息 b. 打开相应网卡并设置为混杂模式 c. 截获数据包并保存为文件 作者 CSDN VC/MFC 网络编程版主 PiggyXP 一捕获数据包的实现原理-------------------------------------------------------------------- 在通常情况下网络通信的套接字程序只能响应与自己硬件地址相匹配的或是以广播形式发出的数据帧对于其他形式的数据帧比如已到达网络接口但却不是发给此地址的数据帧网络接口在验证投递地址并非自身地址之后将不引起响应也就是说应用程序无法收取与自己无关的的数据包。 所以我们要想实现截获流经网络设备的所有数据包就要采取一点特别的手段了 将网卡设置为混杂模式。 这样一来该主机的网卡就可以捕获到所有流经其网卡的数据包和帧。 但是要注意一点这种截获仅仅是数据包的一份拷贝而不能对其进行截断要想截断网络流量就要采用一些更底层的办法了不在本文的讨论范围之内。 二 捕获数据包的编程实现 1.raw socket的实现方法-------------------------------------------------------------------- 不同于我们常用的数据流套接字和数据报套接字在创建了原始套接字后需要用WSAIoctl()函数来设置一下它的定义是这样的 int WSAIoctl( SOCKET s, DWORD dwIoControlCode, LPVOID lpvInBuffer, DWORD cbInBuffer, LPVOID lpvOutBuffer, DWORD cbOutBuffer, LPDWORD lpcbBytesReturned, LPWSAOVERLAPPED lpOverlapped, LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine ); 虽然咋一看参数比较多但是其实我们最关心的只是其中的第二项而已我们需要做的就是把第二项设置为SIO_RCVALL讲了这么多其实要做的就是这么一行代码很简单吧^_^ 当然我们还可以指定是否亲自处理IP头但是这并不是必须的。 完整的代码类似与如下这样加粗的代码是与平常不同的需要注意的地方 ( 为了让代码一目了然我把错误处理去掉了下同) #include “WinSock2.h” #define SIO_RCVALL _WSAIOW(IOC_VENDOR,1) SOCKET SnifferSocket WSADATA wsaData; iFlagWSAStartup(MAKEWORD(2,2),wsaData); //开启winsock.dll SnifferSocketWSASocket(AF_INET, //创建raw socket SOCK_RAW,IPPROTO_IP,NULL,0,WSA_FLAG_OVERLAPPED); char FAR name[128]; //获取本机IP地址 gethostname(name, sizeof(name)); struct hostent FAR * pHostent; pHostent gethostbyname(name); SOCKADDR_IN sa; //填充SOCKADDR_IN结构的内容 sa.sin_family AF_INET; sa.sin_port htons(6000); // 端口号可以随便改当然与当然系统不能冲突 memcpy((sa.sin_addr),pHostent-h_addr,pHostent-h_length); bind(SnifferSocket,(LPSOCKADDR)sa,sizeof(sa)); //绑定 // 置ioctl来接收所有网络数据,关键步骤 DWORD dwBufferLen[10] ; DWORD dwBufferInLen 1 ; DWORD dwBytesReturned 0 ; WSAIoctl(SnifferSocket, IO_RCVALL,dwBufferInLen, izeof(dwBufferInLen), dwBufferLen, sizeof(dwBufferLen),dwBytesReturned , NULL , NULL ); 至此实际就可以开始对网络数据包进行嗅探了而对于数据包的接收还是和普通的socket一样通过recv()函数来完成因为这里涉及到不同的socket模型接收方法差别很大所以在此就不提供接收的代码了。 转载于:https://www.cnblogs.com/henryzc/archive/2005/03/14/118270.html