1、准备工作。从Lazarus安装目录中找到pcap.pp。加到工程中,并引用它。win下要安装WinPcap。
2、写一个读取数据的回调
function htons(hostshort: word): word;
begin
Result := ((hostshort and $00FF) shl 8) or ((hostshort and $FF00) shr 8);
end;
procedure PacketHandler(para1: pansichar; Header: PPcap_Pkthdr; Data: pansichar); cdecl;
begin
//是访问80号端口
if (PWord(Data + 36)^ = htons(80)) or (PWord(Data + 38)^ = htons(80)) then
begin
//数据处理
end;
end;
3、加载网卡设备
var
AllDevs: PPcap_If;
FHandle: ppCap;
ErrBuf: array[0..PCAP_ERRBUF_SIZE - 1] of char;
begin
FillChar(ErrBuf, SizeOf(ErrBuf), 0);
AllDevs := nil;
if pcap_findalldevs(@AllDevs, @ErrBuf) = 0 then //找到网络设备
begin
{$IfDef UNIX}
temp:=Dev^.name;
{$Else}
temp:=Dev^.description;
{$IfEnd}
FHandle := pcap_open_live(pansichar(temp), 65536, 1, 1000, @ErrBuf); //打开网络设备
pcap_loop(FHandle, 0, @PacketHandler, nil);//设置数据回调
//退出程序
pcap_freealldevs(AllDevs);
if FHandle <> nil then
pcap_close(FHandle);
end;
end;
以上程序有个问题,在Linux下可以得到网页的数据包。在win下只能得到Html头信息包。不知道为什么。