现在有个问题,我截获是能得到了,是用Socket来作到的,
但得到的是每一个小包,这样,数据量大的当然一定会分成很多小包,
而我想得到完整的包,就需要知道那个包是开始,那个包是结束。
这点很麻烦。
见下面的截获程序。
function TCYCap_ip.DecodeIpPack(ip:string;buf
char;iBufSize:integer):integer;
var
SourcePort,DestPort: word;
iProtocol, iTTL : integer;
szProtocol: array[0..MAX_PROTO_TEXT_LEN] of char;
szSourceIP: array[0..MAX_ADDR_LEN] of char;
szDestIP : array[0..MAX_ADDR_LEN] of char;
pIpheader : IP_HEADER;
pTcpHeader : TCP_HEADER;
pUdpHeader : UDP_HEADER;
pIcmpHeader: ICMP_HEADER;
saSource, saDest : TSockAddrIn;
iIphLen,data_size: integer;
TcpHeaderLen: integer;
TcpData : pchar;
begin
result := 0;
CopyMemory(@pIpheader,buf,sizeof(pIpheader));
//协议甄别
iProtocol := pIpheader.proto;
StrLCopy(szProtocol, pchar(CheckProtocol(iProtocol)),15);
//源地址
saSource.sin_addr.s_addr := pIpheader.sourceIP;
strlcopy(szSourceIP, inet_ntoa(saSource.sin_addr), MAX_ADDR_LEN);
//目的地址
saDest.sin_addr.s_addr := pIpheader.destIP;
strLcopy(szDestIP, inet_ntoa(saDest.sin_addr), MAX_ADDR_LEN);
iTTL := pIpheader.ttl;
//计算IP首部的长度
iIphLen := sizeof(pIpheader);
//根据协议类型分别调用相应的函数
case iProtocol of
IPPROTO_TCP :begin
CopyMemory(@pTcpHeader,buf+iIphLen,sizeof(pTcpHeader));
SourcePort := ntohs(pTcpHeader.TCP_Sport);//源端口
DestPort := ntohs(pTcpHeader.TCP_Dport); //目的端口
TcpData := buf + iIphLen + sizeof(pTcpHeader);
data_size := iBufSize - iIphLen - sizeof(pTcpHeader);
end;
end;
if Assigned(FOnCap) then
FOnCap(ip, szProtocol, szSourceIP, szDestIP, inttostr(SourcePort), inttostr(DestPort),
buf, iBufSize-data_size, TcpData, data_size);
end;