Below, I’ve included the working AutoIt script, as well as a PureBasic version that was translated from AutoIt using ChatGPT.
I believe I’m very close to a working implementation, but something still isn’t right. Could someone help me figure out what I’m missing?
AutoIT
Code: Select all
ConsoleWrite(_mDNS("p1meter-232322.local") & @CRLF)
Func _mDNS($domain)
Local $return_ip, $domain_convert, $mDNS_msg
$domain = StringReplace($domain , "http://", "")
Local $domain_array = StringSplit($domain, ".")
For $i = 1 To $domain_array[0]
$domain_convert = $domain_convert & Hex(BinaryLen($domain_array[$i]), 2) & StringTrimLeft(StringToBinary($domain_array[$i]), 2)
Next
UDPStartup()
Local $mDNS_sock = UDPOpen("224.0.0.251", 5353)
If @error Then
UDPShutdown()
SetError(1)
Return ""
EndIf
Local $query_time = TimerInit()
UDPSend($mDNS_sock, "0x5A8901000001000000000000" & $domain_convert & "0000010001")
ConsoleWrite("0x5A8901000001000000000000" & $domain_convert & "0000010001" & @CRLF)
Do
$mDNS_msg = UDPRecv($mDNS_sock, 512, 1)
Until $mDNS_msg <> "" Or TimerDiff($query_time) > 1000
UDPShutdown()
For $i = 3 To 0 Step -1
$return_ip = $return_ip & Dec(StringMid(BinaryMid($mDNS_msg, BinaryLen($mDNS_msg) - $i, 1), 3))
If $i <> 0 Then
$return_ip = $return_ip & "."
EndIf
Next
If $return_ip <> "0.0.0.0" Then
Return $return_ip
Else
SetError(2)
EndIf
EndFunc
Code: Select all
EnableExplicit
Procedure.s SendMDNSQuery(domain$)
Define i, j, sock, result$, sendBuf$, domainBin$, part$, segmentCount
Define queryData$, recvBuf$, ipParts.s = "", ip$
domain$ = ReplaceString(LCase(domain$), "http://", "")
If Right(domain$, 6) <> ".local"
domain$ + ".local"
EndIf
Debug "[DEBUG] Domain: " + domain$
segmentCount = CountString(domain$, ".") + 1
For i = 1 To segmentCount
part$ = StringField(domain$, i, ".")
domainBin$ + RSet(Hex(Len(part$), #PB_Byte), 2, "0")
For j = 1 To Len(part$)
domainBin$ + RSet(Hex(Asc(Mid(part$, j, 1))), 2, "0")
Next
Next
;domainBin$ + "00" ; NULL terminator
queryData$ = "5A8901000001000000000000" + domainBin$ + "0000010001"
Debug "[DEBUG] mDNS-query hexstring: " + queryData$
; -- Verbind naar mDNS multicast adres --
sock = OpenNetworkConnection("224.0.0.251", 5353, #PB_Network_UDP)
If Not sock
Debug "[ERROR] Could't open Socket to mDNS-server."
ProcedureReturn ""
EndIf
; -- Send mDNS-query --
For i = 0 To Len(queryData$) - 1 Step 2
sendBuf$ + Chr(Val("$" + Mid(queryData$, i + 1, 2)))
Next
SendNetworkData(sock, @sendBuf$, Len(sendBuf$))
Debug sendBuf$
Debug "[DEBUG] Query send to 224.0.0.251:5353"
; -- Recieve anwser --
Define start = ElapsedMilliseconds()
While ElapsedMilliseconds() - start < 2000
If NetworkClientEvent(sock) = #PB_NetworkEvent_Data
recvBuf$ = Space(512)
ReceiveNetworkData(sock, @recvBuf$, 512)
Debug "[DEBUG] Recieve anwser (lengte = " + Str(Len(recvBuf$)) + ")"
; -- search last 4 bytes for IP --
If Len(recvBuf$) >= 4
For i = 3 To 0 Step -1
ipParts + Str(PeekB(@recvBuf$ + Len(recvBuf$) - i - 1))
If i <> 0
ipParts + "."
EndIf
Next
ip$ = ipParts
Break
EndIf
EndIf
Delay(10)
Wend
CloseNetworkConnection(sock)
If ip$ = "" Or ip$ = "0.0.0.0"
Debug "[DEBUG] No IP adres"
ProcedureReturn ""
EndIf
ProcedureReturn ip$
EndProcedure
; =========[ Main ]=========
Define targetName$, resolvedIP$
resolvedIP$ = SendMDNSQuery("p1meter-232322.local")
If resolvedIP$ <> ""
Debug "✅ IPadres " + targetName$ + " is: " + resolvedIP$
Else
Debug "❌ No anwser from mDNS."
EndIf