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

Internet/网络编程

开发平台:

Delphi

  1. unit Protohdr;
  2. {
  3.   PROTOHDR.PAS
  4.   Original source is PROTOHDR.H
  5.   Written by Sang-Eun Han
  6.   (seh@brabo1.korea.ac.kr,  http://widecomm.korea.ac.kr/~seh).
  7.   Convert to Delphi 4.0 by: Jagad (don@indo.net.id)
  8.   May 10, 1999: Make faster TOULONG and TOUSHORT function and make it works
  9.                 with D3 by: Francois Piette (francois.piette@pophost.eunet.be)
  10. }
  11. {$ALIGN ON}
  12. interface
  13. uses windows;
  14. type
  15. // Ethernet Frame Header
  16. (*
  17. typedef struct _ETHERNET_HDR {
  18. UCHAR Destination[6];
  19. UCHAR Source[6];
  20. UCHAR Protocol[2];
  21. UCHAR Data[1];
  22. } ETHERNET_HDR, *PETHERNET_HDR;
  23. *)
  24. ETHERNET_HDR = packed record
  25.   Destination: array[0..5] of UCHAR;
  26.   Source:      array[0..5] of UCHAR;
  27.   Protocol:    array[0..1] of UCHAR;
  28.   Data:        array[0..0] of UCHAR;
  29. end;
  30. PETHERNET_HDR = ^ETHERNET_HDR;
  31. const
  32. //rfc1340
  33. PROTO_IP      = $0800;
  34. PROTO_ARP     = $0806;
  35. PROTO_XNS     = $0600;
  36. PROTO_SNMP    = $814C;
  37. PROTO_OLD_IPX = $8137;
  38. PROTO_NOVELL  = $8138;
  39. PROTO_IPNG    = $86DD;
  40. OFFSET_IP = 14;
  41. type
  42. // IPv4 Header
  43. (*
  44. typedef struct _IP_RHDR {
  45. UCHAR VerLen;
  46. UCHAR Service;
  47. UCHAR Length[2];
  48. UCHAR Ident[2];
  49. UCHAR Flagoff[2];
  50. UCHAR Timelive;
  51. UCHAR Protocol;
  52. UCHAR Checksum[2];
  53. UCHAR Source[4];
  54. UCHAR Destination[4];
  55. UCHAR Data[1];
  56. } IP_RHDR, *PIP_RHDR;
  57. *)
  58. IP_RHDR = packed record
  59.   Verlen:       UCHAR;
  60.   Service:      UCHAR;
  61.   Length:       array[0..1] of UCHAR;
  62.   Ident:        array[0..1] of UCHAR;
  63.   Flagoff:      array[0..1] of UCHAR;
  64.   TimeLive:     UCHAR;
  65.   Protocol:     UCHAR;
  66.   Checksum:     array[0..1] of UCHAR;
  67.   Source:       array[0..3] of UCHAR;
  68.   Destination:  array[0..3] of UCHAR;
  69.   Data:         array[0..0] of UCHAR;
  70. end;
  71. PIP_RHDR = ^IP_RHDR;
  72. // IPv6 Header
  73. (*
  74. typedef struct _IPNG_RHDR {
  75. UCHAR VerPrio;
  76. UCHAR FlowLabel[3];
  77. UCHAR Length[2];
  78. UCHAR NextHdr;
  79. UCHAR HopLimit;
  80. UCHAR Source[16];
  81. UCHAR Destination[16];
  82. UCHAR Data[1];
  83. } IPNG_RHDR, *PIPNG_RHDR;
  84. *)
  85. IPNG_RHDR = packed record
  86.   VerPrio:        UCHAR;
  87.   FlowLabel:      array[0..2] of UCHAR;
  88.   Length:         array[0..1] of UCHAR;
  89.   NextHadr:       UCHAR;
  90.   HopLimit:       UCHAR;
  91.   Source:         array[0..15] of UCHAR;
  92.   Destination:    array[0..15] of UCHAR;
  93.   Data:           array[0..0] of UCHAR;
  94. end;
  95. PIPNG_RHDR = ^IPNG_RHDR;
  96. // TCP Header, RFC793
  97. (*
  98. typedef struct _TCP_RHDR {
  99. UCHAR Source[2];
  100. UCHAR Destination[2];
  101. UCHAR Seq[4];
  102. UCHAR Ack[4];
  103. UCHAR Rsvd0:4;
  104. UCHAR Offset:4;
  105. UCHAR Flags:6;
  106. UCHAR Rsvd1:2;
  107. UCHAR Window[2];
  108. UCHAR Checksum[2];
  109. UCHAR UrgPoint[2];
  110. UCHAR Data[1];
  111. } TCP_RHDR, *PTCP_RHDR;
  112. *)
  113. TCP_RHDR = packed record
  114.   Source:        array[0..1] of UCHAR; //Source Port
  115.   Destination:   array[0..1] of UCHAR; //Destination Port
  116.   Seq:           array[0..3] of UCHAR;
  117.   Ack:           array[0..3] of UCHAR;
  118.   Rsvd0_Off:     UCHAR;
  119.   Flags_Rsvd1:   UCHAR;
  120.   Window:        array[0..1] of UCHAR;
  121.   Checksum:      array[0..1] of UCHAR;
  122.   UrgPoint:      array[0..1] of UCHAR;
  123.   Data:          array[0..0] of UCHAR;
  124. end;
  125. PTCP_RHDR = ^TCP_RHDR;
  126. const
  127. TCP_FLAG_FIN = $01;
  128. TCP_FLAG_SYN = $02;
  129. TCP_FLAG_RST = $04;
  130. TCP_FLAG_PSH = $08;
  131. TCP_FLAG_ACK = $10;
  132. TCP_FLAG_URG = $20;
  133. PROTO_TCP = 6;
  134. type
  135. // UDP Header
  136. (*
  137. typedef struct _UDP_RHDR {
  138. UCHAR Source[2];
  139. UCHAR Destination[2];
  140. UCHAR Length[2];
  141. UCHAR Checksum[2];
  142. UCHAR Data[1];
  143. } UDP_RHDR, *PUDP_RHDR;
  144. *)
  145. UDP_RHDR = packed record
  146.   Source:        array[0..1] of UCHAR;
  147.   Destination:   array[0..1] of UCHAR;
  148.   Length:        array[0..1] of UCHAR;
  149.   Checksum:      array[0..1] of UCHAR;
  150.   Data:          array[0..0] of UCHAR;
  151. end;
  152. PUDP_RHDR = ^UDP_RHDR;
  153. // Pseudo Header for evaluating TCP/UDP Checksum
  154. (*
  155. typedef struct _PSU_RHDR {
  156. UCHAR Source[4];
  157. UCHAR Destination[4];
  158. UCHAR Zero;
  159. UCHAR Protocol;
  160. UCHAR Length[2];
  161. UCHAR Data[1];
  162. } PSU_RHDR, *PPSU_RHDR;
  163. *)
  164. PSU_RHDR = packed record
  165.   Source:        array[0..3] of UCHAR;
  166.   Destination:   array[0..3] of UCHAR;
  167.   Zero:          UCHAR;
  168.   Protocol:      UCHAR;
  169.   Length:        array[0..1] of UCHAR;
  170.   Data:          array[0..0] of UCHAR;
  171. end;
  172. PPSU_RHDR = ^PSU_RHDR;
  173. //Borland CBuilder is 32 bit Win App
  174. //#ifdef WIN32
  175. //#define TOUSHORT(x) (USHORT)(*(x)<<8|*(x+1))
  176. //#define TOULONG(x) (ULONG)(*(x)<<24|*(x+1)<<16|*(x+2)<<8|*(x+3))
  177. //#else
  178. //#define TOUSHORT(x) (*(USHORT *)x) //Big-Endian
  179. //#define TOULONG(x) (*(ULONG *)x)
  180. //#endif
  181. function TOUSHORT(x: PChar): SHORT;
  182. function TOULONG(x: PChar): ULONG;
  183. implementation
  184. function TOUSHORT(x: PChar): SHORT;
  185. begin
  186.     Result := (SHORT(x^) shl 8) or (SHORT((x + 1)^));  // FP May 10, 1999
  187. end;
  188. function TOULONG(x: PChar): ULONG;
  189. begin
  190.     Result := (ULONG(x^) shl 24) or                    // FP May 10, 1999
  191.               (ULONG((x + 1)^) shl 16) or              // FP May 10, 1999
  192.               (ULONG((x + 2)^) shl 8) or               // FP May 10, 1999
  193.               (ULONG((x + 3)^));                       // FP May 10, 1999
  194. end;
  195. end.