|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Visual Basic Network Services GetAdaptersInfo: Get the IPs for all DHCP Servers |
|
Posted: | Wednesday April 25, 2001 |
Updated: | Monday December 26, 2011 |
Applies to: | VB4-32, VB5, VB6 |
Developed with: | VB6, Windows 2000 |
OS restrictions: | Windows 98, Windows 2000, Windows XP |
Author: | VBnet - Randy Birch |
Related: |
GetAdaptersInfo: Determine if DHCP is Enabled GetAdaptersInfo: Get the DHCP Server IP GetAdaptersInfo: Get the IPs for all DHCP Servers GetAdaptersInfo: Get the Network Adapter IP Address GetAdaptersInfo: Get IP Addresses for All Installed Network Adapters GetNetworkParams: Determine Current and Available DNS Servers |
Prerequisites |
One of the operating systems listed under OS Restrictions above. |
|
The
IP_ADAPTER_INFO type returned from GetAdaptersInfo contains a DhcpServer member, which is a 16-byte string representing the IP address of the
DHCP server.
In some situations more than one DHCP server may be identified with an installed network card, or a system may have more than one net card each connected to the same (or different) DHCP servers. This demo wraps GetAdaptersInfo as DhcpServerAddresses, which enumerates the installed NICs. For each NIC with the uDhcpEnabled flag set, the IP_ADAPTER_INFO's DhcpServer member is retrieved whose data is coerced into an IP_ADDR_STRING structure using CopyMemory. The resulting IP address of the server is concatenated into a single string using the delimiter provided to the call. Enumeration continues until there are no more servers for the NIC, and enumeration begins again at the next installed card. When all enumeration has been completed, the list of DHCP servers is returned as a single string delimited by the character passed to the call. Note that my system uses a LinkSys DSL Router to provide both DHCP and firewall capabilities, so internally the returned addresses are all in the 192.168.1.xxx range. Therefore each adapter in my development machine (which has two NIC cards) uses the same DHCP server address. For clarity in the illustration I used the plus sign as a delimiter; in practice you would probably use a more conventional symbol such as a comma or a pipe. |
BAS Module Code |
None. |
|
Form Code |
To a form add a command button (Command1), and a Text box (Text1). Add the following to the form: |
|
Option Explicit '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ' Copyright ©1996-2011 VBnet/Randy Birch, All Rights Reserved. ' Some pages may also contain other copyrights by the author. '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ' Distribution: You can freely use this code in your own ' applications, but you may not reproduce ' or publish this code on any web site, ' online service, or distribute as source ' on any media without express permission. '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' Private Const MAX_ADAPTER_NAME_LENGTH As Long = 256 Private Const MAX_ADAPTER_DESCRIPTION_LENGTH As Long = 128 Private Const MAX_ADAPTER_ADDRESS_LENGTH As Long = 8 Private Const ERROR_SUCCESS As Long = 0 Private Type IP_ADDRESS_STRING IpAddr(0 To 15) As Byte End Type Private Type IP_MASK_STRING IpMask(0 To 15) As Byte End Type Private Type IP_ADDR_STRING dwNext As Long IpAddress As IP_ADDRESS_STRING IpMask As IP_MASK_STRING dwContext As Long End Type Private Type IP_ADAPTER_INFO dwNext As Long ComboIndex As Long 'reserved sAdapterName(0 To (MAX_ADAPTER_NAME_LENGTH + 3)) As Byte sDescription(0 To (MAX_ADAPTER_DESCRIPTION_LENGTH + 3)) As Byte dwAddressLength As Long sIPAddress(0 To (MAX_ADAPTER_ADDRESS_LENGTH - 1)) As Byte dwIndex As Long uType As Long uDhcpEnabled As Long CurrentIpAddress As Long IpAddressList As IP_ADDR_STRING GatewayList As IP_ADDR_STRING DhcpServer As IP_ADDR_STRING bHaveWins As Long PrimaryWinsServer As IP_ADDR_STRING SecondaryWinsServer As IP_ADDR_STRING LeaseObtained As Long LeaseExpires As Long End Type Private Declare Function GetAdaptersInfo Lib "iphlpapi.dll" _ (pTcpTable As Any, _ pdwSize As Long) As Long Private Declare Sub CopyMemory Lib "kernel32" _ Alias "RtlMoveMemory" _ (dst As Any, _ src As Any, _ ByVal bcount As Long) Private Sub Command1_Click() 'pass a character to be used as the 'delimiter in the list of returned addresses. Text1.Text = DhcpServerAddresses("+") End Sub Public Function DhcpServerAddresses(ByVal sDelim As String) As String 'api vars Dim buff() As Byte Dim cbRequired As Long Dim Adapter As IP_ADAPTER_INFO Dim AdapterStr As IP_ADDR_STRING 'working vars Dim ptr1 As Long Dim ptr2 As Long Dim sAllAddr As String Dim sIPAddr As String Call GetAdaptersInfo(ByVal 0&, cbRequired) If cbRequired > 0 Then ReDim buff(0 To cbRequired - 1) As Byte If GetAdaptersInfo(buff(0), cbRequired) = ERROR_SUCCESS Then 'get a pointer to the data stored in buff() ptr1 = VarPtr(buff(0)) Do While (ptr1 <> 0) 'copy the data from the pointer to the 'first adapter into the IP_ADAPTER_INFO type CopyMemory Adapter, ByVal ptr1, LenB(Adapter) With Adapter If .uDhcpEnabled = 1 Then 'the DHCP info is in the DhcpServer 'member of IP_ADAPTER_INFO. This is 'in the IP_ADDR_STRING format, so 'it needs to be copied to the 'IP_ADDR_STRING type ptr2 = VarPtr(.DhcpServer) 'again, the IP_ADDR_STRING type has a 'dwNext member, indicating that more 'than one DHCP server may be listed, 'so another loop is needed Do While (ptr2 <> 0) CopyMemory AdapterStr, ByVal ptr2, LenB(AdapterStr) With AdapterStr 'the IP address of the DHCP 'server for this adapter. sIPAddr = TrimNull(StrConv(.IpAddress.IpAddr, vbUnicode)) 'add to a string, separating with 'a null character, and continue 'until ptr2 is 0 sAllAddr = sAllAddr & sIPAddr & sDelim 'check for another server ptr2 = .dwNext End With 'With AdapterStr Loop 'Do While (ptr2 <> 0) End If 'If .uDhcpEnabled 'check for another adapter ptr1 = .dwNext End With 'With Adapter 'keep in loop until ptr1 returns 0 '(no more adapters) Loop 'While (ptr1 <> 0) 'if a string was built, remove the last delimiter If Len(sAllAddr) > 0 Then sAllAddr = Left$(sAllAddr, Len(sAllAddr) - 1) End If End If 'If GetAdaptersInfo End If 'If cbRequired > 0 'return any string found DhcpServerAddresses = sAllAddr End Function Private Function TrimNull(item As String) Dim pos As Integer 'double check that there is a chr$(0) in the string pos = InStr(item, Chr$(0)) If pos Then TrimNull = Left$(item, pos - 1) Else TrimNull = item End If End Function |
Comments |
|
|
|
|||||
|
|||||
|
|||||
Copyright ©1996-2011 VBnet and Randy Birch. All Rights Reserved. |