DNS查询代码For Delphi{改}
这次可以把查询出的IP都列出来了
但是没有显示A cName转发等类型..
因为我用不上哪些暂时...
Function QueryDNS2(szHost:PAnsiChar; Server:PAnsiChar; Var bMuch:Boolean):PAnsiChar; Label OnExit; Var dnshdr :PDNS_HDR; dnsqer :PDNS_QER; Buffer :Array [0..BUF_SIZE-1] Of Byte; nSocket:TSocket; SerAddr:TSockAddrIn; I :Integer; nRet :Integer; dwLen :Integer; szDump :PAnsiChar; szDebug:Array [0..31] Of AnsiChar; begin ZeroMemory(@Result, SizeOf(TIPAddr)); nSocket := socket(AF_INET, SOCK_DGRAM, 0); If nSocket = INVALID_SOCKET then Exit; SetSocketIoOutTime(nSocket, 8000); SerAddr.sin_family := AF_INET; SerAddr.sin_port := Htons(SRV_PORT); SerAddr.sin_addr.s_addr := Inet_Addr(Server); if SerAddr.sin_addr.s_addr = SOCKET_ERROR then Goto OnExit; ZeroMemory(@Buffer, BUF_SIZE); Randomize; dnshdr := @Buffer; dnshdr^.id := Random(65534); //$5260; dnshdr^.tag := htons($0100); dnshdr^.numq := htons(1); dnshdr^.numa := 0; lstrcpyA(@Buffer[SizeOf(DNS_HDR) + 1], szHost); I := SizeOf(DNS_HDR) + 1; dwLen := 0; While dwLen < lstrlenA(szHost)-2 Do begin if Buffer[I + dwLen] = 0 then Break; If AnsiChar(Buffer[I + dwLen]) = '.' Then begin Buffer[I - 1] := dwLen; Inc(I, dwLen + 1); dwLen := 0; end Else begin Inc(dwLen); end; end; Buffer[I - 1] := dwLen; dnsqer := PDNS_QER(@Buffer[SizeOf(DNS_HDR) + 3 + lstrlenA(szHost) - 1]); dnsqer^.utype := htons(1); dnsqer^.classes := htons(1); sendto(nSocket, Buffer, SizeOf(DNS_HDR) + SizeOf(DNS_QER) + lstrlenA(szHost) + 2, 0, SerAddr, SizeOf(TSockAddrIn)); I := SizeOf(TSockAddrIn); ZeroMemory(@Buffer, BUF_SIZE); nRet := recvfrom(nSocket, Buffer, BUF_SIZE, 0, SerAddr, I); if dnshdr.numa = 0 then //这里=0是不存在的域名 begin Result := Nil; Goto OnExit; End Else begin dwLen := 0; szDump := @Buffer[nRet - 1]; I := PByte(@szDump[-4])^; while I = 4 do begin Dec(PByte(szDump), 16); I := PByte(@szDump[-4])^; Inc(dwLen); end; bMuch := dwLen > 1; Result := GetMemory(20 * dwLen); ZeroMemory(Result, 20 * dwLen); Inc(PByte(szDump), 12); while Ord(szDump[0]) = 4 do begin Inc(PByte(szDump)); FormatA(@szDebug, '%d.%d.%d.%d ', Ord(szDump[0]), Ord(szDump[1]), Ord(szDump[2]), Ord(szDump[3])); lstrcatA(Result, @szDebug); Inc(PByte(szDump), 4); Inc(PByte(szDump), 11); end; end; OnExit : closesocket(nSocket); end;