如何解决在Windows 7上捕获数据包
| 我正在尝试捕获计算机上所有已传输的数据包。我的代码在Windows XP中可以正常工作,但它只能捕获Windows 7上的传出数据包,而看不到传入的数据包。 这是仅计算接收到的数据包大小的代码版本(虽然看起来很大,但大多数只是定义)。这段代码在Windows XP上可以正常运行,但在Windows 7上则没有任何反应(卡在recvfrom
)(代码完整,可以在Win7上尝试一下):
#include <Winsock2.h>
#include <Mstcpip.h>
#include <iostream>
#include <string>
using namespace std;
#pragma comment(lib,\"Ws2_32.lib\")
struct SIP4HEADER
{
u_char ver_ihl; // Version (4 bits) + Internet header length (4 bits)
u_char tos; // Type of service
u_short tlen; // Total length
u_short ident; // Identification
u_short flags_fo; // Flags (3 bits) + Fragment offset (13 bits)
u_char ttl; // Time to live
u_char proto; // Protocol
u_short crc; // Header checksum
u_long saddr; // Source address
u_long daddr; // Destination address
u_int op_pad; // Option + Padding
};
// Error handling parts is removed for clarity
void main()
{
WSAData wsa={0};
WSAStartup(MAKEWORD(2,2),&wsa);
string strIPAddress;
cout << \"Enter a local IP address to monitor: \";
cin >> strIPAddress;
SOCKET ListenSocket = socket(AF_INET,SOCK_RAW,IPPROTO_IP);
sockaddr_in sa_in;
sa_in.sin_family = AF_INET;
sa_in.sin_addr.s_addr = inet_addr( strIPAddress.c_str() ); //My local IP address
sa_in.sin_port = htons(0);
bind(ListenSocket,(SOCKADDR *) &sa_in,sizeof(sa_in));
int rcv=RCVALL_IPLEVEL;
DWORD b=0;
WSAIoctl(ListenSocket,SIO_RCVALL,&rcv,sizeof(rcv),&b,0);
char buf[2000];
SIP4HEADER* ih = (SIP4HEADER*)buf;
DWORD ReceivedKBytes = 0;
DWORD t = 0;
while( recvfrom(ListenSocket,buf,_countof(buf),NULL,NULL)!=-1 )
{
if(sa_in.sin_addr.s_addr == ih->daddr)
t += ntohs(ih->tlen) ;
// update each 20KB
if(t > 20*1024)
{
t=0;
ReceivedKBytes += 20;
cout << \"Received KBs: \" << ReceivedKBytes << endl;
}
}
}
唯一让我怀疑的是MSDN上的这篇文章,其中说:
用raw调用bind函数
IPPROTO_TCP协议的套接字是
不允许
但是我正在使用IPPROTO_IP
,并且绑定功能文档还说:
绑定函数还可以用于
绑定到原始套接字(该套接字为
通过调用套接字函数创建
类型参数设置为
SOCK_RAW)
因此看来这不是问题。尽管如此,在此代码中调用bind
和其他函数也不会出错。我也省略了调用bind
函数的操作,该函数导致recvfrom
make error 10022 Invalid parameter。我也将IPPROTO_IP
替换为IPPROTO_TCP
,但这都无济于事。
我不确定是否执行正确,但是此代码在Windows XP上可以正常运行。无论如何,我正在寻找一种方法来获取和发送与Windows XP / 7上的本地IP地址有关的数据包。
也:
我在Windows 7中的特权(管理员)模式下运行此代码。
Winpcap或其他第三方库对我来说不是可用的选项。
解决方法
我有同样的问题。原来是Windows 7防火墙阻止了嗅探器查看入站数据。关闭它,最后,代码工作了。
,我在Win7上运行您的代码,它可以工作。我确实看到打印出以下行:
收到的KB:20
收到的KB:40
收到的KB:60
收到的KB:80
收到的KB:100
可能检查您的防火墙?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。