?? dnsquery.pas
字號:
begin
Result := '';
if Length(IP) = 0 then
Exit;
J := Length(IP);
I := J;
while I >= 0 do begin
if (I = 0) or (IP[I] = '.') then begin
Result := Result + '.' + Copy(IP, I + 1, J - I);
J := I - 1;
end;
Dec(I);
end;
if Result[1] = '.' then
Delete(Result, 1, 1);
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure Register;
begin
RegisterComponents('FPiette', [TDnsQuery]);
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
constructor TDnsQuery.Create(AOwner : TComponent);
begin
inherited Create(AOwner);
FWSocket := TWSocket.Create(nil);
FPort := '53';
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
destructor TDnsQuery.Destroy;
begin
if Assigned(FWSocket) then begin
FWSocket.Destroy;
FWSocket := nil;
end;
inherited Destroy;
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TDnsQuery.Notification(AComponent: TComponent; operation: TOperation);
begin
inherited Notification(AComponent, operation);
if operation = opRemove then begin
if AComponent = FWSocket then
FWSocket := nil;
end;
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
function TDnsQuery.GetMXPreference(nIndex : Integer) : Integer;
begin
{ Silently ignore index out of bounds error }
if (nIndex < Low(FMXPreferenceArray)) or
(nIndex > High(FMXPreferenceArray)) then
Result := 0
else
Result := FMXPreferenceArray[nIndex];
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
function TDnsQuery.GetMXExchange(nIndex : Integer) : String;
begin
{ Silently ignore index out of bounds error }
if (nIndex < Low(FMXExchangeArray)) or
(nIndex > High(FMXExchangeArray)) then
Result := ''
else
Result := FMXExchangeArray[nIndex];
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
function TDnsQuery.GetAnswerName(nIndex : Integer) : String;
begin
{ Silently ignore index out of bounds error }
if (nIndex < Low(FAnswerNameArray)) or
(nIndex > High(FAnswerNameArray)) then
Result := ''
else
Result := FAnswerNameArray[nIndex];
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
function TDnsQuery.GetAnswerType(nIndex : Integer) : Integer;
begin
{ Silently ignore index out of bounds error }
if (nIndex < Low(FAnswerTypeArray)) or
(nIndex > High(FAnswerTypeArray)) then
Result := 0
else
Result := FAnswerTypeArray[nIndex];
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
function TDnsQuery.GetAnswerClass(nIndex : Integer) : Integer;
begin
{ Silently ignore index out of bounds error }
if (nIndex < Low(FAnswerClassArray)) or
(nIndex > High(FAnswerClassArray)) then
Result := 0
else
Result := FAnswerClassArray[nIndex];
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
function TDnsQuery.GetAnswerTTL(nIndex : Integer) : LongInt;
begin
{ Silently ignore index out of bounds error }
if (nIndex < Low(FAnswerTTLArray)) or
(nIndex > High(FAnswerTTLArray)) then
Result := 0
else
Result := FAnswerTTLArray[nIndex];
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
function TDnsQuery.GetAnswerTag(nIndex : Integer) : Integer;
begin
{ Silently ignore index out of bounds error }
if (nIndex < Low(FAnswerTagArray)) or
(nIndex > High(FAnswerTagArray)) then
Result := 0
else
Result := FAnswerTagArray[nIndex];
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
function TDnsQuery.GetAddress(nIndex : Integer) : TInAddr;
begin
{ Silently ignore index out of bounds error }
if (nIndex < Low(FAddressArray)) or
(nIndex > High(FAddressArray)) then
Result.S_addr := 0
else
Result := FAddressArray[nIndex];
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
function TDnsQuery.GetHostname(nIndex : Integer) : String;
begin
{ Silently ignore index out of bounds error }
if (nIndex < Low(FHostnameArray)) or
(nIndex > High(FHostnameArray)) then
Result := ''
else
Result := FHostnameArray[nIndex];
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
function TDnsQuery.GetResponseBuf : PChar;
begin
Result := @FResponseBuf;
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
function TDnsQuery.MXLookup(Domain : String) : Integer;
begin
Inc(FIDCount);
BuildRequestHeader(PDnsRequestHeader(@FQueryBuf), FIDCount, DnsOpCodeQuery, TRUE, 1, 0, 0, 0);
FQueryLen := BuildQuestionSection(@FQueryBuf[SizeOf(TDnsRequestHeader)], Domain, DnsQueryMX, DnsClassIN);
FQueryLen := FQueryLen + SizeOf(TDnsRequestHeader);
Result := FIDCount;
SendQuery;
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
function TDnsQuery.ALookup(Host : String) : Integer;
begin
Inc(FIDCount);
BuildRequestHeader(PDnsRequestHeader(@FQueryBuf), FIDCount, DnsOpCodeQuery, TRUE, 1, 0, 0, 0);
FQueryLen := BuildQuestionSection(@FQueryBuf[SizeOf(TDnsRequestHeader)], Host, DnsQueryA, DnsClassIN);
FQueryLen := FQueryLen + SizeOf(TDnsRequestHeader);
Result := FIDCount;
SendQuery;
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
function TDnsQuery.PTRLookup(IP : String) : Integer;
begin
Inc(FIDCount);
BuildRequestHeader(PDnsRequestHeader(@FQueryBuf), FIDCount, DnsOpCodeQuery, TRUE, 1, 0, 0, 0);
FQueryLen := BuildQuestionSection(@FQueryBuf[SizeOf(TDnsRequestHeader)],
ReverseIP(IP) + '.in-addr.arpa',
DnsQueryPTR, DnsClassIN);
FQueryLen := FQueryLen + SizeOf(TDnsRequestHeader);
Result := FIDCount;
SendQuery;
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TDnsQuery.SendQuery;
begin
FResponseLen := -1;
FWSocket.OnDataAvailable := nil;
FWSocket.Abort;
FWSocket.OnDataAvailable := WSocketDataAvailable;
FWSocket.Proto := 'udp';
FWSocket.Port := FPort;
FWSocket.Addr := FAddr;
FWSocket.Connect;
FWSocket.Send(@FQueryBuf, FQueryLen);
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
function TDnsQuery.BuildQuestionSection(
Dst : PChar;
const QName : String;
QType : WORD;
QClass : WORD) : Integer;
var
I : Integer;
p : PChar;
Ptr : PChar;
begin
Ptr := Dst;
if Ptr = nil then begin
Result := 0;
Exit;
end;
I := 1;
while I <= Length(QName) do begin
p := Ptr;
Inc(Ptr);
while (I <= Length(QName)) and (QName[I] <> '.') do begin
Ptr^ := QName[I];
Inc(Ptr);
Inc(I);
end;
p^ := Chr(Ptr - p - 1);
Inc(I);
end;
Ptr^ := #0;
Inc(Ptr);
PWORD(Ptr)^ := htons(QType);
Inc(Ptr, 2);
PWORD(Ptr)^ := htons(QClass);
Inc(Ptr, 2);
Result := Ptr - Dst;
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TDnsQuery.BuildRequestHeader(
Dst : PDnsRequestHeader;
ID : WORD;
OPCode : BYTE;
Recursion : Boolean;
QDCount : WORD;
ANCount : WORD;
NSCount : WORD;
ARCount : WORD);
begin
if Dst = nil then
Exit;
Dst^.ID := htons(ID);
Dst^.Flags := htons((OpCode shl 11) + (Ord(Recursion) shl 8));
Dst^.QDCount := htons(QDCount);
Dst^.ANCount := htons(ANCount);
Dst^.NSCount := htons(NSCount);
Dst^.ARCount := htons(ARCount);
end;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -