Option Explicit
' ¿Ñ§¤ìªÑè¹·Õèá»Å§ËÁÒÂàÅ¢ IPv4 ãËé¡ÅÒÂà»ç¹àÅ¢¨Ó¹Ç¹àµçÁẺäÁè¤Ô´à¤Ã×èͧËÁÒÂá·¹ (ÁÕáµè 0 ¡Ñº àÅ¢ºÇ¡) àªè¹
' ¨Ò¡ 192.168.1.20 ¡ç¨Ð¡ÅÒÂà»ç¹ 335653056 á·¹ áµèãªé§Ò¹¨ÃÔ§Áѹ¨Ðµéͧ»ÃÐÁÇżÅã¹àÅ¢°Ò¹ 2 ¹èФÃѺ
Public Declare Function inet_addr Lib "wsock32.dll" ( _
ByVal s As String) _
As Long
' Êèǹ¹Õé͸ԺÒÂã¹â¤é´´éÒ¹ÅèÒ§¤ÃѺ
Public Declare Function SendARP Lib "iphlpapi.dll" ( _
ByVal DestIP As Long, _
ByVal SrcIP As Long, _
pMacAddress As Long, _
pMacAddressLen As Long _
) As Long
' ¡ÒêÕéµÓá˹觢ͧ Memory Address
Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" ( _
Destination As Any, _
Source As Any, _
ByVal Length As Long _
)
' µÑÇá»ÃẺ Global 㹿ÍÃìÁ¹Õé â»Ãá¡ÃÁÂèÍ·ءæµÑÇ ¨ÐÊÒÁÒöãªé§Ò¹ä´é
' àÍÒäÇéà¡çº¤èҤӵͺ¤ÃѺ
Dim sRemoteMacAddress As String
' ##############################################################
' ¿Ñ§¤ìªÑè¹ÂèÍÂ㹡ÒõÃǨÊͺËÒ¤èÒ MAC Address
Public Function GetMAC(strIPAddress As String) As String
' ##############################################################
If Len(strIPAddress) > 0 Then
' Ê觤èÒ IP Address ä»ãËé¡Ñº¿Ñ§¤ìªÑè¹ GetRemoteAddress
' ¡Ã³ÕÊÒÁÒöËÒ¤èÒ MAC Address ä´é ¿Ñ§¤ìªÑ蹨РReturn ¤èÒ¨ÃÔ§ (True) ¡ÅѺÁÒ
If GetRemoteMACAddress(strIPAddress) Then
GetMAC = sRemoteMacAddress
' ÁÕ¢éͼԴ¾ÅÒ´
Else
GetMAC = "SendARP Fail"
End If
End If
sRemoteMacAddress = ""
End Function
' ##############################################################
' Ê觤èÒ IP Address ÁÒãËé¿Ñ§¤ìªÑè¹ Êèǹ¿Ñ§¤ìªÑ蹨Ф׹¤èÒ¡ÅѺẺ Boolean à¾×èÍá¨é§ÇèÒ·Ó§Ò¹ÊÓàÃç¨ËÃ×ÍäÁè
Function GetRemoteMACAddress( _
sRemoteIP As String _
) As Boolean
' ##############################################################
Dim dwRemoteIP As Long
Dim pMacAddress As Long
' ãËé Pointer ·ÕèªÕéä»ÂѧµÓá˹觤èÒ·Õèà¡çº MAC Address àÍÒäÇé 6 ªØ´
Dim bpMacAddress() As Byte
' ¡Ó˹´ãËé MAC Address ÁÕ¤ÇÒÁÂÒÇ 6 ªØ´
Dim pMacAddrLen As Long
Dim Count As Long
' à»ÅÕ蹤èÒ IP à»ç¹¤èÒµÑÇàŢẺ Long ¡è͹ ´éÇ¿ѧ¤ìªÑè¹ inet_addr ãËéÊѧࡵ´éÇÂÇèÒà¨éÒµÑǹÕéÁѹà»ç¹ API
' ´Ñ§¹Ñé¹â¤é´¹Õé¨Ö§äÁè¨Óà»ç¹µéͧàÅ×Í¡ãªé§Ò¹ WinSock Control ¹èФÃѺ
dwRemoteIP = inet_addr(sRemoteIP)
If dwRemoteIP <> 0 Then
' ¡Ó˹´ªØ´àÅ¢°Ò¹ 16 ¢Í§ MAC Address äÇé 6 µÑÇ (MAC Address ÁѹÁÕ¢¹Ò´ 6 亵ì)
pMacAddrLen = 6
' ¤é¹ËÒ Remote MAC Address ´éÇ API32 (¿Ñ§¤ìªÑè¹ SendARP)
' ÍèÒ¹ÃÒÂÅÐàÍÕ´à¾ÔèÁàµÔÁ
' ARP à»ç¹â»ÃⵤÍÅ ÊÓËÃѺãªéã¹à¤Ã×Í¢èÒÂÃдѺªÑé¹ Data Link Layer (ªÑé¹·Õè 2)
' ˹éÒ·Õè¢Í§ ARP ¡Ñºà¤Ã×Í¢èÒ TCP/IP ¤×Í ªèÇÂá»Å§ IP Address ä»ÊÙè Hardware Address
' àªè¹ MAC Address «Öè§à»ç¹àÅ¢°Ò¹ 16 ¢¹Ò´ 6 亵ì ËÃ×Í 6 ªØ´æÅÐ 1 亵ì àªè¹ 00-13-D4-9E-5B-DB
' ãËéÊѧࡵ´éÇÂÇèÒ SendARP Áѹ¨Ð Return ¤èÒ¡ÅѺà»ç¹µÑÇàÅ¢¨Ó¹Ç¹àµçÁẺ Long
' ËÒ¡ÁѹÊ觤èÒ¡ÅѺÁÒ äÁèà·èҡѺ 0 ¹Ñ蹤×Í à¡Ô´ Error ¢Öé¹ÁÒ¹èФÃѺ ¡çãË騺Í͡仨ҡ¿Ñ§¤ìªÑè¹àÅÂ
' »ÑËÒà¡Ô´¨Ò¡ÊÒà˵ØËÅÑ¡æ ¤×Í ãÊèËÁÒÂàÅ¢ IP ¼Ô´ä» ËÃ×Í ËÒ IP äÁ辺ã¹Ãкºà¤Ã×Í¢èÒÂ
If SendARP(dwRemoteIP, 0&, pMacAddress, pMacAddrLen) = 0 Then
' à§×èÍ¹ä¢ AND ËÒ¡ÍÔ¹¾ØµµÑÇã´µÑÇ˹Öè§à»ç¹ False ¤ÓµÍº¨Ðà»ç¹ False ·Ñ¹·Õ
If pMacAddress <> 0 And pMacAddrLen <> 0 Then
' Áѹ¨ÐÁÕ¡ÒÃÊ觤èÒ Pointer à¾×èͪÕéµÓá˹è§à¡çº¢éÍÁÙŢͧ MAC Address
' ´Ñ§¹Ñé¹µéͧ¨Ñ´à¡çº¢éÍÁÙÅŧ㹠Array 6 ªØ´ ËÃ×Í 6 µÓá˹è§
ReDim bpMacAddress(0 To pMacAddrLen - 1)
' ¤Ñ´ÅÍ¡µÓá˹è§áá ËÃ×Í àÃÔèÁµé¹ (0) ·Õèµéͧ¡ÒêÕéä»ËÒ áÅÐ ¹Ñºä»ÍÕ¡ 6 µÓá˹è§
' ªÕéµÓá˹è§à·èÒ¹Ñé¹¹èФÃѺ Êèǹ¤èÒ·Õèà¡çº ¤×Í MAC Address ¢¹Ò´ 1 亵ì (ÃÇÁ¡Ñ¹áÅéÇ 6 µÑÇ)
' àªè¹ 00-13-D4-9E-5B-DB áµèÅЪش·Õè¤Ñè¹´éÇÂà¤Ã×èͧËÁÒ - ¨ÐÁÕ¢¹Ò´ 1 亵ì ËÃ×Í 8 ºÔµ
CopyMemory bpMacAddress(0), pMacAddress, ByVal pMacAddrLen
' ǹÃͺà¾×èÍËÒ¤èÒáµèÅеÓá˹è§
For Count = 0 To pMacAddrLen - 1
' àªè¹ Åͧ·´Êͺ Debug ´Ùã¹ Immediate Windows ¡ç¨ÐàËç¹µÓáË¹è§ Address ·ÕèªÕéä» àªè¹
' ? VarPtr(bpMacAddress(1))
' ÍèÒ¹¤èÒµÓá˹è§àÅ¢°Ò¹ 10 ¨Ðä´é 140001186 ËÃ×Í
' ? Hex$(VarPtr(bpMacAddress(1)))
' ÍèÒ¹¤èÒµÓá˹è§àÅ¢°Ò¹ 16 ¨Ðä´é 8583 FA2 (¤èÒã¹áµèÅÐà¤Ã×èͧ áÅÐ áµèÅФÃÑ駨Ðä´éäÁèàËÁ×͹¡Ñ¹¹èФÃѺ)
' ËÒ¡ÍÂÒ¡ÃÙé¤èÒ MAC Address àÅ¢°Ò¹ 16 ¡ç¾ÔÁ¾ìã¹Ë¹éÒµèÒ§ Immediate Windows
' ? Hex$(bpMacAddress(1)) ... ¨Ðä´é¤ÓµÍº ¤×Í 13 (àÅ¢°Ò¹ 16)
' ¨Ò¡¹Ñ鹡ç¨ÐàÍÒ¤èÒ·ÕèÍÂÙè Hex$(bpMacAddress(Count)) ã¹µÓá˹觷ÕèªÕé仹Ñé¹ÍÍ¡ÁÒà¡çºã¹µÑÇá»Ã Array
' ¹Õè¤×Í Pointer In The Visual Basic ... ¤×Í ÁѹªÕé仵ÓáË¹è§ Memory Address áµèàÍÒ¤èÒ·ÕèÍÂÙèã¹µÓá˹觹Ñé¹ÁÒ¹èФÃѺ
If Count = pMacAddrLen - 1 Then
' à»ç¹ªØ´ÊØ´·éÒ ¨Ö§äÁèµéͧàÍÒà¤Ã×èͧËÁÒ - ÁÒµèÍ·éÒ¤ÃѺ
sRemoteMacAddress = sRemoteMacAddress & Right("00" & Hex$(bpMacAddress(Count)), 2)
Else
' ÍèÒ¹¤èÒ MAC Address ¨Ò¡ 5 µÑÇáá ... ·ÕèàËç¹â¤é´´éÒ¹ÅèҧẺ¹Õé¡çà¾ÃÒÐ
' ªØ´ááÁѹä´é¤èÒ 0 ÍÍ¡ÁÒà¾Õ§µÑÇà´ÕÂǹèФÃѺ ... µéͧÅͧ Debug ´Ù¨ÐÁͧàËç¹
sRemoteMacAddress = sRemoteMacAddress & Right("00" & Hex$(bpMacAddress(Count)) & "-", 3)
End If
Next
' ¤×¹¤èÒ¡ÅѺà»ç¹ True à¾×èÍáÊ´§ÇèÒÊÒÁÒö·Ó§Ò¹ä´é¶Ù¡µéͧ
If Len(sRemoteMacAddress) > 0 Then GetRemoteMACAddress = True
' ÍÍ¡¨Ò¡¿Ñ§¤ìªÑè¹ä»ä´éàÅÂ
Exit Function
Else
' à¡Ô´¢éͼԴ¾ÅÒ´ pMacAddress <> 0 And pMacAddrLen <> 0
' ¡Ã³Õ AND ... ËÒ¡ Input µÑÇã´µÑÇ˹Öè§à»ç¹ False ¤ÓµÍº¨Ðà»ç¹ False àÊÁÍ
GetRemoteMACAddress = False
End If
Else
' à¡Ô´¢éͼԴ¾ÅÒ´ SendARP Ê觤èÒ¡ÅѺÁÒà»ç¹ 0
GetRemoteMACAddress = False
End If
Else
' à¡Ô´¢éͼԴ¾ÅÒ´ dwRemoteIP ·Ó¡ÒÃà»ÅÕ蹤èÒ IP ÁÕ¤èÒà»ç¹ 0
GetRemoteMACAddress = False
End If
End Function
|