2
0

Quick.Network.pas 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. { ***************************************************************************
  2. Copyright (c) 2015-2018 Kike Pérez
  3. Unit : Quick.Network
  4. Description : Network related functions
  5. Author : Kike Pérez
  6. Version : 1.4
  7. Created : 11/07/2017
  8. Modified : 07/04/2018
  9. This file is part of QuickLib: https://github.com/exilon/QuickLib
  10. ***************************************************************************
  11. Licensed under the Apache License, Version 2.0 (the "License");
  12. you may not use this file except in compliance with the License.
  13. You may obtain a copy of the License at
  14. http://www.apache.org/licenses/LICENSE-2.0
  15. Unless required by applicable law or agreed to in writing, software
  16. distributed under the License is distributed on an "AS IS" BASIS,
  17. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  18. See the License for the specific language governing permissions and
  19. limitations under the License.
  20. *************************************************************************** }
  21. unit Quick.Network;
  22. {$i QuickLib.inc}
  23. interface
  24. uses
  25. Classes,
  26. SysUtils,
  27. Math,
  28. IdDNSResolver;
  29. type
  30. TDNSResolve = class
  31. private
  32. fHost : string;
  33. fPort : Integer;
  34. function ResolveDNS(const aDNS : string; aRegType: TQueryRecordTypes): string;
  35. public
  36. constructor Create(const aNameServer : string = '8.8.8.8'; aServerPort : Integer = 53);
  37. function ResolveA(const aDNS : string): string;
  38. function ResolveAAAA(const aDNS : string): string;
  39. function ResolveCNAME(const aDNS : string): string;
  40. function ResolveNS(const aDNS : string): string;
  41. function ResolveTXT(const aDNS : string): string;
  42. end;
  43. function IntToIPv4(IPv4: LongWord): string;
  44. function IPv4ToInt(const IPv4: string) : LongWord;
  45. function IPv4ToIntReverse(const IPv4: string) : LongWord;
  46. procedure CIDRToRange(CIDR : string; out MinIP,MaxIP : string); overload;
  47. procedure CIDRToRange(CIDR : string; out MinIP,MaxIP : LongWord); overload;
  48. procedure GetIPRange(const cIP, cMask : string; out LowIP, HighIP : string);
  49. implementation
  50. function IntToIPv4(IPv4: LongWord): string;
  51. var
  52. Retvar : string;
  53. iSeg,iShift,
  54. i, iMask : LongWord;
  55. begin
  56. Retvar := '';
  57. iShift := 24;
  58. iMask := $FF000000;
  59. for i := 1 to 4 do
  60. begin
  61. iSeg := (IPv4 and iMask) shr iShift;
  62. Retvar := Retvar + IntToStr(iSeg);
  63. if i < 4 then Retvar := Retvar + '.';
  64. iMask := iMask shr 8;
  65. dec(iShift,8);
  66. end;
  67. Result := Retvar;
  68. end;
  69. function IPv4ToInt(const IPv4: string) : LongWord;
  70. var
  71. S : TStrings;
  72. begin
  73. S := TStringList.Create;
  74. try
  75. S.Delimiter := '.';
  76. S.DelimitedText := IPv4;
  77. if S.Count <> 4 then raise Exception.Create('Invalid IP4 Address string');
  78. Result := (StrToInt(S[0]) shl 24) + (StrToInt(S[1]) shl 16) + (StrToInt(S[2]) shl 8) + StrToInt(S[3]);
  79. finally
  80. S.Free;
  81. end;
  82. end;
  83. function IPv4ToIntReverse(const IPv4: string) : LongWord;
  84. var
  85. S : TStrings;
  86. begin
  87. S := TStringList.Create;
  88. try
  89. S.Delimiter := '.';
  90. S.DelimitedText := IPv4;
  91. if S.Count <> 4 then raise Exception.Create('Invalid IP4 Address string');
  92. Result := (StrToInt(S[3]) shl 24) + (StrToInt(S[2]) shl 16) + (StrToInt(S[1]) shl 8) + StrToInt(S[0]);
  93. finally
  94. S.Free;
  95. end;
  96. end;
  97. procedure CIDRToRange(CIDR : string; out MinIP,MaxIP : string);
  98. var
  99. Mask : Integer;
  100. begin
  101. Mask := StrToInt(Copy(CIDR,Pos('/',CIDR)+1,CIDR.Length));
  102. CIDR := Copy(CIDR,0,Pos('/',CIDR)-1);
  103. MinIP := IntToIPv4((IPv4ToInt(CIDR)) and ((-1 shl (32 - Mask))));
  104. MaxIP := IntToIPv4((IPv4ToInt(MinIP)) + Round(Power(2,(32 - Mask))) - 1);
  105. end;
  106. procedure CIDRToRange(CIDR : string; out MinIP,MaxIP : LongWord);
  107. var
  108. Mask : Integer;
  109. aux : string;
  110. begin
  111. Mask := StrToInt(Copy(CIDR,Pos('/',CIDR)+1,CIDR.Length));
  112. CIDR := Copy(CIDR,0,Pos('/',CIDR)-1);
  113. aux := IntToIPv4((IPv4ToInt(CIDR)) and ((-1 shl (32 - Mask))));
  114. MinIP := IPv4ToInt(aux);
  115. aux := IntToIPv4((IPv4ToInt(aux)) + Round(Power(2,(32 - Mask))) - 1);
  116. MaxIP := IPv4ToInt(aux);
  117. end;
  118. procedure GetIPRange(const cIP, cMask : string; out LowIP, HighIP : string);
  119. begin
  120. try
  121. LowIP := IntToIPv4((IPv4ToInt(cIP) and (IPv4ToInt(cMask)) + 1));
  122. HighIP := IntToIPv4(IPv4ToInt(cIP) or not(IPv4ToInt(cMask))-1);
  123. except
  124. on E : Exception do raise Exception.Create(Format('GetIPRange error: %s',[e.Message]));
  125. end;
  126. end;
  127. { TDNSResolve }
  128. constructor TDNSResolve.Create(const aNameServer : string = '8.8.8.8'; aServerPort : Integer = 53);
  129. begin
  130. fHost := aNameServer;
  131. fPort := aServerPort;
  132. end;
  133. function TDNSResolve.ResolveDNS(const aDNS : string; aRegType: TQueryRecordTypes): string;
  134. var
  135. dnsresolver : TIdDNSResolver;
  136. begin
  137. Result := '';
  138. dnsresolver := TIdDNSResolver.Create(nil);
  139. try
  140. dnsresolver.Host := fHost;
  141. dnsresolver.Port := fPort;
  142. dnsresolver.QueryResult.Clear;
  143. dnsresolver.QueryType := [aRegType];
  144. dnsresolver.Resolve(aDNS);
  145. if dnsresolver.QueryResult.Count > 0 then
  146. begin
  147. if dnsresolver.QueryResult[0].RecType = aRegType then
  148. begin
  149. case aRegType of
  150. qtNS : Result := TNSRecord(dnsresolver.QueryResult.Items[0]).HostName;
  151. qtA : Result := TARecord(dnsresolver.QueryResult.Items[0]).IPAddress;
  152. qtAAAA : Result := TAAAARecord(dnsresolver.QueryResult.Items[0]).Address;
  153. qtNAME : Result := TCNRecord(dnsresolver.QueryResult.Items[0]).HostName;
  154. qtTXT : Result := TTextRecord(dnsresolver.QueryResult.Items[0]).Text.Text;
  155. else raise Exception.Create('Not implemented yet!');
  156. end;
  157. end;
  158. end;
  159. finally
  160. dnsresolver.Free;
  161. end;
  162. end;
  163. function TDNSResolve.ResolveNS(const aDNS : string): string;
  164. begin
  165. Result := ResolveDNS(aDNS,qtNS);
  166. end;
  167. function TDNSResolve.ResolveA(const aDNS : string): string;
  168. begin
  169. Result := ResolveDNS(aDNS,qtA);
  170. end;
  171. function TDNSResolve.ResolveAAAA(const aDNS : string): string;
  172. begin
  173. Result := ResolveDNS(aDNS,qtAAAA);
  174. end;
  175. function TDNSResolve.ResolveCNAME(const aDNS : string): string;
  176. begin
  177. Result := ResolveDNS(aDNS,qtName);
  178. end;
  179. function TDNSResolve.ResolveTXT(const aDNS : string): string;
  180. begin
  181. Result := ResolveDNS(aDNS,qtTXT);
  182. end;
  183. end.