我試圖在計算機上捕獲所有傳輸的數據包。我的代碼在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_IP
和bind function documentation還表示:
綁定函數也可以用來 綁定到原始套接字(套接字被 通過調用套接字函數 設置爲 SOCK_RAW類型參數創建)
所以看來這不是問題。儘管如此,我並沒有從調用bind
和此代碼中的其他函數中得到任何錯誤。我也省略了調用bind
函數,導致recvfrom
出錯10022參數無效。我也用IPPROTO_TCP
替換了IPPROTO_IP
,但它也沒有幫助。
我不確定自己是否正確執行此操作,但此代碼在Windows XP上沒有任何問題。無論如何,我正在尋找一種在Windows XP/7上獲取和發送與本地IP地址相關的數據包的方法。
另外:
- 我運行的特權(管理員)模式下,該代碼在Windows 7
- WinPcap的或其他第三方庫是不是我的可用選項。
WSRIoControl的返回值未在剪切中檢查。電話是否成功? – harper 2011-05-25 14:11:01
@harper:是的,我檢查了所有返回值,他們都很好。這段代碼不需要任何依賴,所以你可以測試它,如果你有興趣。 – Isaac 2011-05-27 13:40:05