Dns lookup without 'RunProgram("nslookup.exe", ...' ?
Posted: Fri Mar 18, 2016 6:24 am
Hi.
Help please.
nslookup in cmd.exe - several IP addresses
DnsQuery - only one IP address
How to get all IP addresses (as in "nslookup.exe"), but without using "nslookup.exe", only code PB?
Best regards!
Help please.
nslookup in cmd.exe - several IP addresses
Code: Select all
nslookup google.com
Addresses: 2a00:1450:4010:c0f::65
213.158.11.241
213.158.11.245
213.158.11.226
213.158.11.215
213.158.11.249
213.158.11.221
213.158.11.222
213.158.11.251
213.158.11.219
213.158.11.230
213.158.11.236
213.158.11.207
213.158.11.234
213.158.11.237
213.158.11.211

Code: Select all
#DNS_TYPE_A = $0001 ; // 1
#DNS_TYPE_NS = $0002 ; // 2
#DNS_TYPE_MD = $0003 ; // 3
#DNS_TYPE_MF = $0004 ; // 4
#DNS_TYPE_CNAME = $0005 ; // 5
#DNS_TYPE_SOA = $0006 ; // 6
#DNS_TYPE_MB = $0007 ; // 7
#DNS_TYPE_MG = $0008 ; // 8
#DNS_TYPE_MR = $0009 ; // 9
#DNS_TYPE_NULL = $000a ; // 10
#DNS_TYPE_WKS = $000b ; // 11
#DNS_TYPE_PTR = $000c ; // 12
#DNS_TYPE_HINFO = $000d ; // 13
#DNS_TYPE_MINFO = $000e ; // 14
#DNS_TYPE_MX = $000f ; // 15
#DNS_TYPE_TEXT = $0010 ; // 16
#DNS_QUERY_STANDARD = $00000000
#DNS_QUERY_ACCEPT_TRUNCATED_RESPONSE = $00000001
#DNS_QUERY_USE_TCP_ONLY = $00000002
#DNS_QUERY_NO_RECURSION = $00000004
#DNS_QUERY_BYPASS_CACHE = $00000008
#DNS_QUERY_NO_WIRE_QUERY = $00000010
#DNS_QUERY_NO_LOCAL_NAME = $00000020
#DNS_QUERY_NO_HOSTS_FILE = $00000040
#DNS_QUERY_NO_NETBT = $00000080
#DNS_QUERY_WIRE_ONLY = $00000100
#DNS_QUERY_RETURN_MESSAGE = $00000200
#DNS_QUERY_TREAT_AS_FQDN = $00001000
#DNS_QUERY_DONT_RESET_TTL_VALUES = $00100000
#DNS_QUERY_RESERVED = $ff000000
Enumeration ; DNS_FREE_TYPE
#DnsFreeFlat = 0
#DnsFreeRecordList
#DnsFreeParsedMessageFields
EndEnumeration
Structure DNS_A_DATA
IpAddress.l
EndStructure
Structure DNS_PTR_DATAA
*pNameHost
EndStructure
Structure DNS_RECORD
*pNext.DNS_RECORD;
pName.s
wType.w
wDataLength.w
StructureUnion
DW.l
S.l
EndStructureUnion
dwTtl.l
dwReserved.l
StructureUnion
A.DNS_A_DATA
PTR.DNS_PTR_DATAA
CNAME.DNS_PTR_DATAA
EndStructureUnion
EndStructure
Prototype DnsQuery_(Name.s, wType.w, fOptions.l, *aopServers, *ppQueryResultSet, *pReserved)
Prototype DnsRecordListFree(*RecordList, FreeType)
Global DnsQuery_.DnsQuery_, DnsRecordListFree.DnsRecordListFree
Procedure LoadDnsApi(Library)
Protected Result
Result = OpenLibrary(Library, "Dnsapi.dll")
If Result
If Library = #PB_Any
Library = Result
EndIf
CompilerIf #PB_Compiler_Unicode
DnsQuery_ = GetFunction(Library, "DnsQuery_W")
CompilerElse
DnsQuery_ = GetFunction(Library, "DnsQuery_A")
CompilerEndIf
DnsRecordListFree = GetFunction(Library, "DnsRecordListFree")
If DnsQuery_ = 0 Or DnsRecordListFree = 0
CloseLibrary(Library)
Result = 0
EndIf
EndIf
ProcedureReturn Result
EndProcedure
ProcedureDLL.l DnsQuery(ServerName$, nRecordType = #DNS_TYPE_A)
Protected IP = 0, CName$, *Record.DNS_RECORD
If DnsQuery_ And DnsRecordListFree
If DnsQuery_(ServerName$, nRecordType, #DNS_QUERY_STANDARD|#DNS_QUERY_NO_HOSTS_FILE, #Null, @*Record.DNS_RECORD, #Null) = 0 And *Record
If *Record\wType = #DNS_TYPE_A
IP = *Record\A\IpAddress
ElseIf *Record\wType = #DNS_TYPE_CNAME Or *Record\wType = #DNS_TYPE_MX
CName$ = PeekS(*Record\CNAME\pNameHost)
If CName$
IP = DnsQuery(CName$)
EndIf
EndIf
DnsRecordListFree(*Record, #DnsFreeRecordList)
EndIf
EndIf
ProcedureReturn IP
EndProcedure
InitNetwork()
ServerName$="google.com"
Debug ServerName$
LoadDnsApi(#PB_Any)
IP=DnsQuery(ServerName$, #DNS_TYPE_A)
Debug IPString(IP)
Best regards!