unit MainForm;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Pcap;
type
TForm1 = class(TForm)
Memo1: TMemo;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure PacketHandler(user: Pointer; const hdr: pcap_pkthdr; const pkt: PByte); cdecl;
begin
// 在这里处理捕获到的数据包
// user参数可以用来传递自定义数据
// hdr参数包含数据包的头信息
// pkt参数是数据包的内容
end;
procedure TForm1.Button1Click(Sender: TObject);
var
pcap: Ppcap_t;
errbuf: array[0..PCAP_ERRBUF_SIZE-1] of AnsiChar;
begin
// 打开网络接口
pcap := pcap_open_live('eth0', 65536, 1, 1000, errbuf);
if pcap = nil then
begin
ShowMessage('无法打开网络接口:' + string(errbuf));
Exit;
end;
// 设置过滤器(可选)
if pcap_compile(pcap, @bpf_program, 'tcp port 80', 1, PCAP_NETMASK_UNKNOWN) = -1 then
begin
ShowMessage('无法编译过滤器:' + string(pcap_geterr(pcap)));
pcap_close(pcap);
Exit;
end;
if pcap_setfilter(pcap, @bpf_program) = -1 then
begin
ShowMessage('无法设置过滤器:' + string(pcap_geterr(pcap)));
pcap_close(pcap);
Exit;
end;
// 开始捕获数据包
pcap_loop(pcap, 0, @PacketHandler, nil);
// 关闭网络接口
pcap_close(pcap);
end;
end.
请注意,上述代码使用了第三方库Pcap.pas,你需要先下载并安装该库才能编译运行。