⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dxdnsservercore.pas

📁 Well known and usefull component for delphi 7
💻 PAS
📖 第 1 页 / 共 2 页
字号:
   fOnCommandNS:=Value;
   AddSimpleEvent(2,Value);
End;

Procedure TDXDNSServerCore.SetOnCommandMD(Value:DNSTSimpleEvent);
Begin
   fOnCommandMD:=Value;
   AddSimpleEvent(3,Value);
End;

Procedure TDXDNSServerCore.SetOnCommandMF(Value:DNSTSimpleEvent);
Begin
   fOnCommandMF:=Value;
   AddSimpleEvent(4,Value);
End;

Procedure TDXDNSServerCore.SetOnCommandCNAME(Value:DNSTSimpleEvent);
Begin
   fOnCommandCNAME:=Value;
   AddSimpleEvent(5,Value);
End;

Procedure TDXDNSServerCore.SetOnCommandSOA(Value:DNSTSimpleEvent);
Begin
   fOnCommandSOA:=Value;
   AddSimpleEvent(6,Value);
End;

Procedure TDXDNSServerCore.SetOnCommandMB(Value:DNSTSimpleEvent);
Begin
   fOnCommandMB:=Value;
   AddSimpleEvent(7,Value);
End;

Procedure TDXDNSServerCore.SetOnCommandMG(Value:DNSTSimpleEvent);
Begin
   fOnCommandMG:=Value;
   AddSimpleEvent(8,Value);
End;

Procedure TDXDNSServerCore.SetOnCommandMR(Value:DNSTSimpleEvent);
Begin
   fOnCommandMR:=Value;
   AddSimpleEvent(9,Value);
End;

Procedure TDXDNSServerCore.SetOnCommandNULL(Value:DNSTSimpleEvent);
Begin
   fOnCommandNULL:=Value;
   AddSimpleEvent(10,Value);
End;

Procedure TDXDNSServerCore.SetOnCommandWKS(Value:DNSTSimpleEvent);
Begin
   fOnCommandWKS:=Value;
   AddSimpleEvent(11,Value);
End;

Procedure TDXDNSServerCore.SetOnCommandPTR(Value:DNSTSimpleEvent);
Begin
   fOnCommandPTR:=Value;
   AddSimpleEvent(12,Value);
End;

Procedure TDXDNSServerCore.SetOnCommandHINFO(Value:DNSTSimpleEvent);
Begin
   fOnCommandHINFO:=Value;
   AddSimpleEvent(13,Value);
End;

Procedure TDXDNSServerCore.SetOnCommandMINFO(Value:DNSTSimpleEvent);
Begin
   fOnCommandMINFO:=Value;
   AddSimpleEvent(14,Value);
End;

Procedure TDXDNSServerCore.SetOnCommandMX(Value:DNSTSimpleEvent);
Begin
   fOnCommandMX:=Value;
   AddSimpleEvent(15,Value);
End;

Procedure TDXDNSServerCore.SetOnCommandTXT(Value:DNSTSimpleEvent);
Begin
   fOnCommandTXT:=Value;
   AddSimpleEvent(16,Value);
End;

Procedure TDXDNSServerCore.SetOnCommandRP(Value:DNSTSimpleEvent);
Begin
   fOnCommandRP:=Value;
   AddSimpleEvent(17,Value);
End;

Procedure TDXDNSServerCore.SetOnCommandAFSDB(Value:DNSTSimpleEvent);
Begin
   fOnCommandAFSDB:=Value;
   AddSimpleEvent(18,Value);
End;

Procedure TDXDNSServerCore.SetOnCommandX25(Value:DNSTSimpleEvent);
Begin
   fOnCommandX25:=Value;
   AddSimpleEvent(19,Value);
End;

Procedure TDXDNSServerCore.SetOnCommandISDN(Value:DNSTSimpleEvent);
Begin
   fOnCommandISDN:=Value;
   AddSimpleEvent(20,Value);
End;

Procedure TDXDNSServerCore.SetOnCommandRT(Value:DNSTSimpleEvent);
Begin
   fOnCommandRT:=Value;
   AddSimpleEvent(21,Value);
End;

Procedure TDXDNSServerCore.SetOnCommandOSINSAP(Value:DNSTSimpleEvent);
Begin
   fOnCommandOSINSAP:=Value;
   AddSimpleEvent(22,Value);
End;

Procedure TDXDNSServerCore.SetOnCommandAXFR(Value:DNSTSimpleEvent);
Begin
   fOnCommandAXFR:=Value;
   AddSimpleEvent(252,Value);
End;

Procedure TDXDNSServerCore.SetOnCommandMAILB(Value:DNSTSimpleEvent);
Begin
   fOnCommandMAILB:=Value;
   AddSimpleEvent(253,Value);
End;

Procedure TDXDNSServerCore.SetOnCommandMAILA(Value:DNSTSimpleEvent);
Begin
   fOnCommandMAILA:=Value;
   AddSimpleEvent(254,Value);
End;

Procedure TDXDNSServerCore.SetOnCommandALL(Value:DNSTSimpleEvent);
Begin
   fOnCommandALL:=Value;
   AddSimpleEvent(255,Value);
End;


(******************************************************************************
PROCESSSESSION:
               If you want this CORE to process the parsing, you should call
               this from your "OnNewConnect" implementation. This should be
               right after your call to SayHello (optional).
******************************************************************************)
//    QR=1bit
//    OPCODE=4bits(0=query, 1=inverse query, 2=server status, 3-15 reserved.}
//    AA=1bit     (Authoritative flag}
//    TC=1bit     (Truncation flag}
//    RD=1bit     (Recursion desired)
//    RA=1bit     (Recursion available)
//    Z=3bits     (reserved)
//    RCODE=4bites(0=no error, 1=format error, 2=server problem,
//                 3=server cant find it, 4=query not supported,
//                 6=not authorized to do this,6-15 reserved.)
procedure TDXDNSServerCore.ProcessSession(ClientThread: TDXClientThread);
var
  S:String;
  Loop:Integer;
  WasHandled:Boolean;
  Packet:PDXDNSQueryPacket;
  QueryWord:Word;
  OutData:Pointer;

Procedure DecodeFlags(W:Word);
Begin
   With Packet^ do Begin
      QR:=(W And $8000)=$8000;                  // 1bit
      OpCode:=((W And $7800) Shr 11) And $000F; // 4bit
      AA:=(W And $0400)=$0400;                  // 1bit
      TC:=(W And $0200)=$0200;                  // 1bit
      RD:=(W And $0100)=$0100;                  // 1bit
      RA:=(W And $0080)=$0080;                  // 1bit
      // z (reserved)                           // 3bit
      RCode:=(W And $000F);                     // 4bit
   End;
End;

Procedure CustomSwap(S:String;Position:Integer;Var Dest:Word);
Var
   OWord:Word;

Begin
   FastMove(S[Position],OWord,2);
   SwapMove(OWord,Dest);
End;

begin
   with ClientThread.Socket do begin
      S:=ReadStr(CharactersToRead);
      If S<>'' then Begin
         if assigned({$IFDEF TLS_EDITION}OnReadFilter{$ELSE}OnFilter{$ENDIF}) then begin
            Loop:=FilterRead(@S[1],OutData,Length(S),ClientThread);
            SetLength(S,Loop);
            If Assigned(OutData) then Begin
               FastMove(TDXBSArray(OutData^),S[1],Loop);
{$IFDEF TLS_EDITION}OnReadFilter{$ELSE}OnFilter{$ENDIF}(ddFreePointer,nil,OutData,Loop,Loop,WasHandled,ClientThread) ;
            End;
         End;
      End
      Else Exit;
      ProcessWindowsMessageQueue;
      New(Packet);
//      FillChar2(Packet^,Sizeof(TDXDNSQueryPacket),#0);
      // ID=16bits
      CustomSwap(S,1,Packet^.ID);
      // QR,OPCODE,AA,TC,RD,RA,Z,RCODE=16bits
      CustomSwap(S,3,QueryWord);
      DecodeFlags(QueryWord);
      // QDCOUNT
      CustomSwap(S,5,Packet^.QDCount);
      // ANCOUNT
      CustomSwap(S,7,Packet^.ANCount);
      // NSCOUNT
      CustomSwap(S,9,Packet^.NSCount);
      // ARCOUNT
      CustomSwap(S,11,Packet^.ARCount);
      Delete(S,1,12); // only thing left is the query.
      Packet^.Query:=DecodeDomain(Copy(S,1,Length(S)-4));
      Delete(S,1,Length(S)-4);
      CustomSwap(S,1,Packet^.QueryType);
      CustomSwap(S,3,Packet^.QueryClass);
      Loop:=0;
      WasHandled:=False;
      While (Loop<fEventArray.Count) and (Not WasHandled) do Begin
         If PDNSSimpleEvent(fEventArray[Loop]).Command=Packet^.QueryType then Begin
            Case PDNSSimpleEvent(fEventArray[Loop]).Tag of
               1:With Packet^ Do
                 if Assigned(PDNSSimpleEvent(fEventArray[Loop]).EventProcedure) then
                    DNSTSimpleEvent(PDNSSimpleEvent(fEventArray[Loop]).EventProcedure)(ClientThread,Packet);
            End;
            WasHandled:=True;
         End
         Else Inc(Loop);
      End;
      Dispose(Packet);
      If Not WasHandled then Begin
         if assigned(OnCommandOther) then
            OnCommandOther(ClientThread,Packet,WasHandled);
      end;
   end;
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -