Posted: Sat May 20, 2006 10:56 am
Thank you Flype 

http://www.purebasic.com
https://www.purebasic.fr/english/
Code: Select all
Structure ADDRESS
IpLong.l
IpString.s
MacString.s
MacLength.l
MacArray.b[6]
EndStructure
Procedure.l GetIPAddresses(usrList.ADDRESS(), HostName.s = "")
Protected wsa.WSADATA, *host.HOSTENT
If WSAStartup_(1<<8|1, wsa) = #NOERROR
*host = gethostbyname_(HostName)
WSACleanup_()
If *host
For i = 0 To *host\h_length - 1
If AddElement(usrList())
usrList()\IpLong = PeekL(PeekL(*host\h_addr_list)+(i*SizeOf(Long)))
usrList()\IpString = IPString(usrList()\IpLong)
usrList()\MacLength = SizeOf(ADDRESS\MacArray)
If SendARP_(usrList()\IpLong, 0, @usrList()\MacArray, @usrList()\MacLength) = #NO_ERROR
For j = 0 To usrList()\MacLength - 2
usrList()\MacString + RSet(Hex(usrList()\MacArray[j] & 255), 2, "0") + ":"
Next
usrList()\MacString + RSet(Hex(usrList()\MacArray[j] & 255), 2, "0")
EndIf
EndIf
Next
EndIf
EndIf
ProcedureReturn CountList(usrList())
EndProcedure
NewList list.ADDRESS()
If GetIPAddresses(list())
ForEach list()
Debug "IP: " + list()\IpString
Debug "MAC: " + list()\MacString
Next
EndIf
Indeed, that's a pointnetmaestro wrote:Nice code, Flype! If I may make one infinitely tiny suggestion, PB4 has unsigned bytes now, so MacArray.c[6] would be slightly cleaner as & 255 wouldn't be needed.
Code: Select all
Procedure.l GetIPAddresses(usrList.ADDRESS(), HostName.s = "")
Code: Select all
Procedure.l GetIPAddresses(List usrList.ADDRESS(), HostName.s = "")
Code: Select all
ProcedureReturn CountList(usrList())
Code: Select all
ProcedureReturn ListSize(usrList())
Code: Select all
Procedure.s x_getipaddress(host.s) ; find ip address for given hostname
Protected *host.HOSTENT, *m
;
; based on code by flype
;
If host > ""
If WSAStartup_ ((1<<8|1), wsa.WSADATA) = #NOERROR
*m = AllocateMemory(#MAX_COMPUTERNAME_LENGTH+1)
PokeS(*m,host,#MAX_COMPUTERNAME_LENGTH,#PB_Ascii)
*host.HOSTENT = gethostbyname_(*m)
WSACleanup_()
FreeMemory(*m)
If *host
ProcedureReturn PeekS(inet_ntoa_(PeekL(PeekL(*host\h_addr_list))),#MAX_COMPUTERNAME_LENGTH,#PB_Ascii)
EndIf
EndIf
EndIf
EndProcedure
Procedure.s x_getmacaddress(ip.s) ; find mac address for given ip address
Protected n.i, l.i, *ip, *mac, mac.s
;
; based on code by flype
;
l = Len(ip)
n = 6
;
*ip = AllocateMemory(l+1)
*mac = AllocateMemory(n)
PokeS(*ip,ip,l,#PB_Ascii)
If SendARP_(inet_addr_(*ip),0,*mac, @n) = #NO_ERROR
For i = 0 To n - 2
mac = mac + RSet(Hex(PeekA(*mac+i)),2,"0") + ":"
Next
mac = mac + RSet(Hex(PeekA(*mac+i)),2,"0")
Else
mac = ""
EndIf
FreeMemory(*ip)
FreeMemory(*mac)
ProcedureReturn mac
EndProcedure
Code: Select all
InitNetwork()
Procedure GetIPAddr()
If ExamineIPAddresses()
IP = NextIPAddress()
If IP
ProcedureReturn IP
EndIf
EndIf
EndProcedure
Procedure.s GetMacAddr()
Protected.l n = 6
Dim MacAddr.b(n)
If SendARP_(GetIPAddr(), 0, @MacAddr(0), @n) = #NO_ERROR
For i = 0 To n - 2
MAC$ + RSet(Hex(MacAddr(i) & 255), 2, "0") + ":"
Next
ProcedureReturn MAC$ + RSet(Hex(MacAddr(i) & 255), 2, "0")
EndIf
EndProcedure
Debug Hostname()
Debug IPString(GetIPAddr())
Debug GetMacAddr()