在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),0,0,&b,0,0);

    char buf[2000];
    SIP4HEADER* ih = (SIP4HEADER*)buf;
    DWORD ReceivedKBytes = 0;
    DWORD t = 0;
    while( recvfrom(ListenSocket,buf,_countof(buf),0,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 可能检查您的防火墙?     

要回复问题请先登录注册