IngusPacket.pas
上传用户:sunrenlu
上传日期:2007-01-08
资源大小:199k
文件大小:9k
源码类别:

Internet/网络编程

开发平台:

Delphi

  1. {
  2.   Helper to handle packet
  3.   ----------------------------------
  4.   Writen by: Jagad (don@indo.net.id)
  5.   Updates by FP (francois.piette@pophost.eunet.be, http://www.rtfm.be/fpiette)
  6.   May 12, 1999  FPiette  Added UDP Support
  7.   May 14, 1999: Jagad    Add Length property at TIngusIPPacket
  8. }
  9. unit IngusPacket;
  10. interface
  11. uses windows, Protohdr, Ingusclass;
  12. type
  13. (*
  14. typedef struct tagTRANSPORT_PROTOCOLS {
  15. UCHAR Protocol;
  16. TCHAR szName[20];
  17. TCHAR szDescription[MAX_PATH];
  18. } TRANSPORT_PROTOCOLS, *LPTRANSPORT_PROTOCOLS;
  19. *)
  20. tagTRANSPORT_PROTOCOLS = packed record
  21.   Protocol: UCHAR;
  22.   szName: array [0..19] of Char;
  23.   szDescription: array[0..MAX_PATH-1] of Char;
  24. end;
  25. TRANSPORT_PROTOCOLS = tagTRANSPORT_PROTOCOLS;
  26. LPTRANSPORT_PROTOCOLS = ^TRANSPORT_PROTOCOLS;
  27. (*
  28. //see rfc1340.txt
  29. TRANSPORT_PROTOCOLS transProtos[] = {
  30. {1 , "ICMP",    "Internet Control Message" },
  31. {2 , "IGMP",    "Internet Group Management"},
  32. {3 , "GGP" ,    "Gateway-to-Gateway"},
  33. {4 , "IP"  ,    "IP in IP (encasulation)"},
  34. {5 , "ST"  ,    "Stream"},
  35. {6 , "TCP" ,    "Transmission Control"},
  36. {8 , "EGP" ,    "Exterior Gateway Protocol"},
  37. {9 , "IGP" ,    "any private interior gateway"},
  38. {17, "UDP" ,    "User Datagram"},
  39. {27, "RDP" ,    "Reliable Data Protocol"},
  40. {28, "IRTP",    "Internet Reliable Transaction"},
  41. {29, "ISO-TP4" ,  "ISO Transport Protocol Class 4"},
  42. {35, "IDPR"    ,  "Inter-Domain Policy Routing Protocol"},
  43. {37, "DDP"     ,  "Datagram Delivery Protocol"},
  44. {38, "IDPR-CMTP", "IDPR Control Message Transport Proto"},
  45. {88, "IGRP"     , "IGRP"},
  46. {89, "OSPFIGP"  , "OSPFIGP"},
  47. {92, "MTP"      , "Multicast Transport Protocol"},
  48. {94, "IPIP"     , "IP-within-IP Encapsulation Protocol"},
  49. {97, "ETHERIP"  , "Ethernet-within-IP Encapsulation"},
  50. {98, "ENCAP"    , "Encapsulation Header"}
  51. };
  52. #define TRANSPROTOS_MAX (sizeof(transProtos)/sizeof(TRANSPORT_PROTOCOLS))
  53. *)
  54. TRANSPORT_PROTOCOLS_ARRAY = array [0..20] of TRANSPORT_PROTOCOLS;
  55. const
  56.     transProtos: TRANSPORT_PROTOCOLS_ARRAY = (
  57.     (Protocol: 1;     szName: 'ICMP';      szDescription: 'Internet Control Message'),
  58.     (Protocol: 2;     szName: 'IGMP';      szDescription: 'Internet Group Management'),
  59.     (Protocol: 3;     szName: 'GGP';       szDescription: 'Gateway-to-Gateway'),
  60.     (Protocol: 4;     szName: 'IP' ;       szDescription: 'IP in IP (encasulation)'),
  61.     (Protocol: 5;     szName: 'ST' ;       szDescription: 'Stream'),
  62.     (Protocol: 6;     szName: 'TCP';       szDescription: 'Transmission Control'),
  63.     (Protocol: 8;     szName: 'EGP';       szDescription: 'Exterior Gateway Protocol'),
  64.     (Protocol: 9;     szName: 'IGP';       szDescription: 'any private interior gateway'),
  65.     (Protocol: 17;    szName: 'UDP';       szDescription: 'User Datagram'),
  66.     (Protocol: 27;    szName: 'RDP';       szDescription: 'Reliable Data Protocol'),
  67.     (Protocol: 28;    szName: 'IRTP';      szDescription: 'Internet Reliable Transaction'),
  68.     (Protocol: 29;    szName: 'ISO-TP4';   szDescription: 'ISO Transport Protocol Class 4'),
  69.     (Protocol: 35;    szName: 'IDPR'   ;   szDescription: 'Inter-Domain Policy Routing Protocol'),
  70.     (Protocol: 37;    szName: 'DDP'    ;   szDescription: 'Datagram Delivery Protocol'),
  71.     (Protocol: 38;    szName: 'IDPR-CMTP'; szDescription: 'IDPR Control Message Transport Proto'),
  72.     (Protocol: 88;    szName: 'IGRP'    ;  szDescription: 'IGRP'),
  73.     (Protocol: 89;    szName: 'OSPFIGP' ;  szDescription: 'OSPFIGP'),
  74.     (Protocol: 92;    szName: 'MTP'     ;  szDescription: 'Multicast Transport Protocol'),
  75.     (Protocol: 94;    szName: 'IPIP'    ;  szDescription: 'IP-within-IP Encapsulation Protocol'),
  76.     (Protocol: 97;    szName: 'ETHERIP' ;  szDescription: 'Ethernet-within-IP Encapsulation'),
  77.     (Protocol: 98;    szName: 'ENCAP'   ;  szDescription: 'Encapsulation Header')
  78. );
  79. const
  80.   TRANSPROTOS_MAX = 20; //it's Delphi :)
  81. (*
  82. typedef struct _XICMPProto{
  83.     UCHAR icmp_type;
  84. UCHAR icmp_code;
  85. USHORT icmp_cksum;
  86. ULONG filler;
  87. }XICMP_HDR, *PXICMP_HDR;
  88. *)
  89. type
  90. _XICMPProto = packed record
  91.   icmp_type: UCHAR;
  92.   icmp_code: UCHAR;
  93.   icmp_cksum: SHORT;
  94.   filler: ULONG;
  95. end;
  96. XICMP_HDR = _XICMPProto;
  97. PXICMP_HDR = ^XICMP_HDR;
  98. (*
  99. typedef struct _XARPProto{
  100.     USHORT  ar_hwtype;
  101.     USHORT  ar_prtype;
  102.     UCHAR   ar_hwlen;
  103.     UCHAR   ar_prlen;
  104.     UCHAR   ar_op;
  105.     char    ar_addr[1];
  106. }XARP_HDR, *XPARP_HDR;
  107. *)
  108. _XARPProto = packed record
  109.   ar_hwtype: SHORT;
  110.   ar_prtype: SHORT;
  111.   ar_hwlen: UCHAR;
  112.   ar_prlen: UCHAR;
  113.   ar_op: UCHAR;
  114.   ar_addr: array[0..0] of Char;
  115. end;
  116. (*
  117. #define ARP_REQUEST     1
  118. #define ARP_REPLY       2
  119. #define RARP_REQUEST    3
  120. #define RARP_REPLY      4
  121. *)
  122. const
  123.   ARP_REQUEST  =    1;
  124.   ARP_REPLY    =    2;
  125.   RARP_REQUEST =    3;
  126.   RARP_REPLY   =    4;
  127. type
  128.   //
  129.   //This classes will allow to trap event based on type of packet
  130.   //
  131.   TIngusIPPacket = class(TIngusPacketBase)
  132.   private
  133.     FIPProto: integer;
  134.     FIPSourceAddr: PChar;
  135.     FIPDestAddr: PChar;
  136.     FData: PChar;
  137.     FpIPHdr: PIP_RHDR;
  138.     FIPLength: integer;
  139.   protected
  140.   public
  141.     constructor Create(MacAddr: PChar; uBuffer: PChar); override;
  142.     destructor Destroy; override;
  143.     property IPProtocol: integer read FIPProto;
  144.     property IPHeader: PIP_RHDR read FpIPHdr;
  145.     property IPSourceAddr: PChar read FIPSourceAddr;
  146.     property IPDestAddr: PChar read FIPDestAddr;
  147.     property IPData: PChar read FData;
  148.     property IPLength: integer read FIPLength;
  149.   end;
  150.   TIngusICMPPacket = class(TIngusIPPacket)
  151.   private
  152.     FIcmpType: UCHAR;
  153.     FIcmpCode: UCHAR;
  154.     FpIcmpHdr: PXICMP_HDR;
  155.   protected
  156.   public
  157.     constructor Create(MacAddr: PChar; uBuffer: PChar); override;
  158.     destructor Destroy; override;
  159.     property ICMPHdr: PXICMP_HDR read FpIcmpHdr;
  160.     property ICMPType: UCHAR read FIcmpType;
  161.     property ICMPCode: UCHAR read FIcmpCode;
  162.   end;
  163.   TIngusTCPPacket = class(TIngusIPPacket)
  164.   private
  165.     FSourcePort: SHORT;
  166.     FDestPort: SHORT;
  167.     FSeq: ULONG;
  168.     FAck: ULONG;
  169.     FFlag: integer;
  170.     FTCPHdr: PTCP_RHDR;
  171.   protected
  172.     function GetFlag: integer;
  173.   public
  174.     constructor Create(MacAddr: PChar; uBuffer: PChar); override;
  175.     destructor Destroy; override;
  176.     property TCPHeader: PTCP_RHDR read FTCPHdr;
  177.     property SourcePort: SHORT read FSourcePort;
  178.     property DestPort: SHORT read FDestPort;
  179.     property SeqNum: ULONG read FSeq;
  180.     property AckNum: ULONG read FAck;
  181.     property Flag: integer read FFlag;
  182.   end;
  183.   TIngusUDPPacket = class(TIngusIPPacket)
  184.   private
  185.     FSourcePort: SHORT;
  186.     FDestPort: SHORT;
  187.     FUDPHdr: PUDP_RHDR;
  188.   public
  189.     constructor Create(MacAddr: PChar; uBuffer: PChar); override;
  190.     property UDPHeader: PUDP_RHDR read FUDPHdr;
  191.     property SourcePort: SHORT read FSourcePort;
  192.     property DestPort: SHORT read FDestPort;
  193.   end;
  194. implementation
  195. //------ TIngusUDPPacket ------//
  196. constructor TIngusUDPPacket.Create(MacAddr: PChar; uBuffer: PChar);
  197. begin
  198.   inherited Create(MacAddr, uBuffer);
  199.   FUDPHdr     := PUDP_RHDR(IPData);
  200.   FSourcePort := TOUSHORT(@(FUDPHdr^.Source[0]));
  201.   FDestPort   := TOUSHORT(@(FUDPHdr^.Destination[0]));
  202. end;
  203. //------ TIngusTCPPacket ------//
  204. function TIngusTCPPacket.GetFlag: integer;
  205. begin
  206.   Result := FTCPHdr^.Flags_Rsvd1 and $FC;
  207.   if Result <> 0 then
  208.     Result := FTCPHdr^.Flags_Rsvd1 div $4; //Shift Right 2 bits
  209. end;
  210. constructor TIngusTCPPacket.Create(MacAddr: PChar; uBuffer: PChar);
  211. begin
  212.   inherited Create(MacAddr, uBuffer);
  213.   FTCPHdr := PTCP_RHDR(IPData);
  214.   FSourcePort := TOUSHORT(@(FTCPHdr^.Source[0]));
  215.   FDestPort := TOUSHORT(@(FTCPHdr^.Destination[0]));
  216.   FSeq := TOULONG(@(FTCPHdr^.Seq[0]));
  217.   FAck := TOULONG(@(FTCPHdr^.Ack[0]));
  218.   FFlag := GetFlag;
  219. end;
  220. destructor TIngusTCPPacket.Destroy;
  221. begin
  222.   //...
  223.   inherited Destroy;
  224. end;
  225. //----- TIngusIPPacket -----//
  226. constructor TIngusIPPacket.Create(MacAddr: PChar; uBuffer: PChar);
  227. begin
  228.   inherited Create(MacAddr, uBuffer);
  229.   FpIPHdr := PIP_RHDR(EthernetData);
  230.   FIPSourceAddr := @(FpIPHdr^.Source[0]);
  231.   FIPDestAddr := @(FpIPHdr^.Destination[0]);
  232.   FData := @(FpIPHdr^.Data[0]);
  233.   FIPProto := FpIPHdr^.Protocol;
  234.   FIPLength := TOUSHORT(@(FpIPHdr^.Length[0]));
  235. end;
  236. destructor TIngusIPPacket.Destroy;
  237. begin
  238.   //...
  239.   inherited Destroy;
  240. end;
  241. //----- TIngusICMPPacket -----//
  242. constructor TIngusICMPPacket.Create(MacAddr: PChar; uBuffer: PChar);
  243. begin
  244.   inherited Create(MacAddr, uBuffer);
  245.   FpIcmpHdr := PXICMP_HDR(IPData);
  246.   FIcmpType := FpIcmpHdr^.icmp_type;
  247.   FIcmpCode := FpIcmpHdr^.icmp_code;
  248. end;
  249. destructor TIngusICMPPacket.Destroy;
  250. begin
  251.   //...
  252.   inherited Destroy;
  253. end;
  254. end.