我有一个用Delphi编写的工作嗅探器程序。它在局域网中很好。但是当我的计算机在WLAN上时,它不会记录任何内容。初始化:
if (WSAStartup(MAKEWORD(2,2), Wsa) <> 0) then ErrorMsg ('WSAStartup');
//Create a RAW Socket
sniffer:= socket(AF_INET, SOCK_RAW, IPPROTO_IP);
if (sniffer = INVALID_SOCKET) then ErrorMsg ('Socket');
//Retrive the local hostname
getmem (hostname, 100);
if (gethostname(hostname, 100) = SOCKET_ERROR) then ErrorMsg ('Gethostname');
//Retrive the available IPs of the local host
local:= gethostbyname(hostname);
if (local = nil) then ErrorMsg ('Gethostbyname');
i:= 0;
repeat
i:= i + 1;
Move (local^.h_addr^[i-1], Addr, sizeof(Tinaddr));
until (local^.h_addr^[i-1] <> #0);
Players.MyIP:= inet_ntoa(Addr);
if Players.MyIP = '0.0.0.0' then
begin
Showmessage ('No IP!?'); halt;
end;
_in:= 0;
FillChar (Dest, SizeOf(Dest), 0);
Move (local^.h_addr^[_in], dest.sin_addr.s_addr, sizeof(dest.sin_addr.s_addr));
dest.sin_family:= AF_INET;
dest.sin_port := 0;
if (bind(sniffer, @dest, sizeof(dest))) = SOCKET_ERROR then ErrorMsg ('Bind');
j:= 1;
if (WSAIoctl(sniffer, SIO_RCVALL, @j,4, nil, 0, LPDWORD(@_in),nil, nil)) = SOCKET_ERROR then ErrorMsg ('WSAIoctl');
捕获线程
while not Terminated do
begin
mangobyte:= recvfrom (sniffer,Buffer^,65536,0,nil,nil); //Eat as much as u can
if (mangobyte > 0) then
begin
adsasdasd
end
所以它不会记录任何东西。我错过了什么吗?
答案 0 :(得分:3)
我认为无线局域网是指WiFi。以太网(LAN)数据包采用802.3格式,WiFi数据包采用802.11格式。我不确定你的嗅探器到底在做什么,但802.3帧的解析与解析802.11帧不同。 Windows XP和早期版本不支持本机WiFi,因此驱动程序必须使用802.3标头包装无线数据包以模拟以太网(LAN)数据包。从Vista开始,不需要包装,操作系统直接处理802.11帧。除非您使用WinXP或更早版本,否则您需要对无线帧进行不同的解析。
答案 1 :(得分:2)
您绑定到第一个可用的本地IP(BTW,请勿使用gethostbyname()
枚举本地IP,因为无法保证返回正确的值。使用GetAdaptersInfo()或{{3而不是)。如果计算机安装了多个IP,则可能绑定到错误的IP。在这种情况下,您应该让用户选择要绑定的IP。