2011-05-24 34 views
2

我試圖在計算機上捕獲所有傳輸的數據包。我的代碼在Windows XP中工作正常,但它僅捕獲Windows 7上的傳出數據包,並且無法看到傳入數據包。在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; 
     } 
    } 
} 

唯一讓我嫌疑犯this article上MSDN誰說:

的調用bind函數與原始 插座用於IPPROTO_TCP協議 不允許

,但我用IPPROTO_IPbind function documentation還表示:

綁定函數也可以用來 綁定到原始套接字(套接字被 通過調用套接字函數 設置爲 SOCK_RAW類型參數創建)

所以看來這不是問題。儘管如此,我並沒有從調用bind和此代碼中的其他函數中得到任何錯誤。我也省略了調用bind函數,導致recvfrom出錯10022參數無效。我也用IPPROTO_TCP替換了IPPROTO_IP,但它也沒有幫助。

我不確定自己是否正確執行此操作,但此代碼在Windows XP上沒有任何問題。無論如何,我正在尋找一種在Windows XP/7上獲取和發送與本地IP地址相關的數據包的方法。

另外:

  • 我運行的特權(管理員)模式下,該代碼在Windows 7
  • WinPcap的或其他第三方庫是不是我的可用選項。
+0

WSRIoControl的返回值未在剪切中檢查。電話是否成功? – harper 2011-05-25 14:11:01

+0

@harper:是的,我檢查了所有返回值,他們都很好。這段代碼不需要任何依賴,所以你可以測試它,如果你有興趣。 – Isaac 2011-05-27 13:40:05

回答

2

我有同樣的問題。原來是Windows 7防火牆阻止嗅探器查看入站數據。關閉它,最後,代碼工作。

0

我在我的Win7上運行你的代碼,它的工作原理。我看到下面的打印出來行: 收到KB爲:20個 收到KB爲:40個 收到KB爲:60個 收到KB爲:80個 收到KB爲:100

大概檢查您的防火牆?

+0

謝謝。它是否正確顯示您的下載流量,或者下載的Kbytes的估算值遠低於您下載的估算值? – Isaac 2011-06-01 11:21:51

+0

除了默認的Windows防火牆,我沒有防火牆,禁用它也沒有幫助。你能告訴我什麼操作系統正在使用?它是32位還是64位?你有沒有安裝任何ServicePack? – Isaac 2011-06-01 11:29:42