1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121
| unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, winsock, ComCtrls;
type
TForm1 = class(TForm)
ListView1: TListView;
procedure FormCreate(Sender: TObject);
procedure ListView1Change(Sender: TObject; Item: TListItem; Change: TItemChange);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Déclarations privées }
public
{ Déclarations publiques }
end;
type
USHORT = Word;
TIPHeader = record
iph_verlen: UCHAR;
iph_tos: UCHAR;
iph_length: USHORT;
iph_id: USHORT;
iph_offset: USHORT;
iph_ttl: UCHAR;
iph_protocol: UCHAR;
iph_xsum: USHORT;
iph_src: ULONG;
iph_dest: ULONG;
end;
PIPHeader = ^TIPHeader;
const
MAX_PACKET_SIZE = $10000;
SIO_RCVALL = $98000001;
var
Form1: TForm1;
Buffer: array [0..MAX_PACKET_SIZE] of Char;
flag: Integer;
hThread: Cardinal;
implementation
{$R *.DFM}
procedure ListenThread(LV: TListView); stdcall;
var
lowbyte, hibyte: USHORT;
wsadata: TWSAData;
s: TSocket;
name: array [0..128]of Char;
phe: PHostent;
sa: TSockAddrIn;
sa1: TInAddr;
count: Integer;
hdr: PIPHeader;
begin
flag:=1;
WSAStartup(MAKEWORD(2,2), wsadata);
s := socket(AF_INET, SOCK_RAW, IPPROTO_IP);
gethostname(name, sizeof(name));
phe := gethostbyname(name);
ZeroMemory(@sa, sizeof(sa));
sa.sin_family := AF_INET;
sa.sin_addr.s_addr := cardinal(pointer(phe^.h_addr_list^)^);
bind(s, sa, sizeof(TSockaddr));
ioctlsocket(s, SIO_RCVALL, flag);
repeat
count := recv(s, Buffer, sizeof(Buffer), 0);
if (count >= sizeof(TIPHeader)) then
with LV.Items.Add do
begin
hdr := @Buffer;
Caption:= TimeToStr(Time);
case hdr.iph_protocol of
IPPROTO_TCP: SubItems.Add('TCP');
IPPROTO_UDP: SubItems.Add('UDP');
IPPROTO_RAW: SubItems.Add('RAW');
IPPROTO_ICMP: SubItems.Add('ICMP');
IPPROTO_IGMP: SubItems.Add('IGMP');
IPPROTO_IP: SubItems.Add('IP');
else SubItems.Add('') end;
sa1.s_addr := hdr.iph_src;
SubItems.Add(inet_ntoa(sa1));
sa1.s_addr := hdr.iph_dest;
SubItems.Add(inet_ntoa(sa1));
lowbyte := hdr.iph_length shr 8;
hibyte := hdr.iph_length shl 8;
hibyte := hibyte + lowbyte;
// SubItems.Add(IntToStr(hibyte));
SubItems.Add(IntToStr(hdr.iph_ttl));
end;
until false;
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
while not TerminateThread(hThread,0) do
Sleep(500);
end;
procedure TForm1.FormCreate(Sender: TObject);
var
ThID: Cardinal;
begin
hThread:=CreateThread(nil,0,@ListenThread,ListView1,0,ThID);
if hThread=0 then ShowMessage(SysErrorMessage(GetLastError));
end;
procedure TForm1.ListView1Change(Sender: TObject; Item: TListItem;
Change: TItemChange);
begin
ListView1.Scroll(0,Item.Position.y);
end;
end. |