How To Obtain the Host IP Address Using Windows Sockets

Last reviewed: December 9, 1996
Article ID: Q160215
The information in this article applies to:
  • Standard, Professional, and Enterprise Editions of Microsoft Visual Basic, 32-bit only, for Windows, version 4.0

SUMMARY

This article demonstrates how to obtain the host IP address of the local machine by using the GetHostByName API of the Windows Sockets dll, Wsock32.dll. To obtain the host IP address, you must use GetHostByName in conjunction with GetHostName.

MORE INFORMATION

GetHostName returns the standard host name for the local machine. You can use GetHostByName to resolve this name and return a pointer to the HOSTENT structure. This structure contains the host address information.

Step-by-Step Example

  1. Start a new project in Visual Basic. Form1 is created by default.

  2. Place a CommandButton, Command1, on Form1.

  3. Place the following code in the General Declarations section of Form1.

    Private Const WS_VERSION_REQD = &H101 Private Const WS_VERSION_MAJOR = WS_VERSION_REQD \ &H100 And &HFF& Private Const WS_VERSION_MINOR = WS_VERSION_REQD And &HFF& Private Const MIN_SOCKETS_REQD = 1 Private Const SOCKET_ERROR = -1 Private Const WSADescription_Len = 256 Private Const WSASYS_Status_Len = 128

    Private Type HOSTENT

           hName As Long
           hAliases As Long
           hAddrType As Integer
           hLength As Integer
           hAddrList As Long
    
    End Type

    Private Type WSADATA

           wversion As Integer
           wHighVersion As Integer
           szDescription(0 To WSADescription_Len) As Byte
           szSystemStatus(0 To WSASYS_Status_Len) As Byte
           iMaxSockets As Integer
           iMaxUdpDg As Integer
           lpszVendorInfo As Long
    
    End Type

       Private Declare Function WSAGetLastError Lib "WSOCK32.DLL" () As Long
       Private Declare Function WSAStartup Lib "WSOCK32.DLL" (ByVal
       wVersionRequired&, lpWSAData As WSADATA) As Long
       Private Declare Function WSACleanup Lib "WSOCK32.DLL" () As Long
       Private Declare Function gethostname Lib "WSOCK32.DLL" (ByVal hostname$,
       HostLen&) As Long
       Private Declare Function gethostbyname Lib "WSOCK32.DLL" (ByVal
       hostname$) As Long
    
       Private Declare Sub RtlMoveMemory Lib "KERNEL32" (hpvDest As Any, ByVal
       hpvSource&, ByVal cbCopy&)
    
       Function hibyte(ByVal wParam As Integer)
    
           hibyte = wParam \ &H100 And &HFF&
    
       End Function
    
       Function lobyte(ByVal wParam As Integer)
    
           lobyte = wParam And &HFF&
    
       End Function
    
       Sub SocketsInitialize()
       Dim WSAD As WSADATA
       Dim iReturn As Integer
       Dim sLowByte As String, sHighByte As String, sMsg As String
    
           iReturn = WSAStartup(WS_VERSION_REQD, WSAD)
    
           If iReturn <> 0 Then
               MsgBox "Winsock.dll is not responding."
               End
           End If
    
           If lobyte(WSAD.wversion) < WS_VERSION_MAJOR Or
       (lobyte(WSAD.wversion) = WS_VERSION_MAJOR And hibyte(WSAD.wversion) <
       WS_VERSION_MINOR) Then
               sHighByte = Trim$(Str$(hibyte(WSAD.wversion)))
               sLowByte = Trim$(Str$(lobyte(WSAD.wversion)))
               sMsg = "Windows Sockets version " & sLowByte & "." & sHighByte
               sMsg = sMsg & " is not supported by winsock.dll "
               MsgBox sMsg
               End
           End If
    
           If WSAD.iMaxSockets < MIN_SOCKETS_REQD Then
               sMsg = "This application requires a minimum of "
               sMsg = sMsg & Trim$(Str$(MIN_SOCKETS_REQD)) & " supported
       sockets."
               MsgBox sMsg
               End
           End If
    
       End Sub
    
       Sub SocketsCleanup()
       Dim lReturn As Long
    
           lReturn = WSACleanup()
    
           If lReturn <> 0 Then
               MsgBox "Socket error " & Trim$(Str$(lReturn)) & " occurred in
       Cleanup "
               End
           End If
    
       End Sub
    
       Sub Form_Load()
    
           SocketsInitialize
    
       End Sub
    
       Private Sub Form_Unload(Cancel As Integer)
    
           SocketsCleanup
    
       End Sub
    
       Private Sub Command1_click()
       Dim hostname As String * 256
       Dim hostent_addr As Long
       Dim host As HOSTENT
       Dim hostip_addr As Long
       Dim temp_ip_address() As Byte
       Dim i As Integer
       Dim ip_address As String
    
           If gethostname(hostname, 256) = SOCKET_ERROR Then
               MsgBox "Windows Sockets error " & Str(WSAGetLastError())
               Exit Sub
           Else
               hostname = Trim$(hostname)
           End If
    
           hostent_addr = gethostbyname(hostname)
    
           If hostent_addr = 0 Then
               MsgBox "Winsock.dll is not responding."
               Exit Sub
           End If
    
           RtlMoveMemory host, hostent_addr, LenB(host)
           RtlMoveMemory hostip_addr, host.hAddrList, 4
    
           ReDim temp_ip_address(1 To host.hLength)
           RtlMoveMemory temp_ip_address(1), hostip_addr, host.hLength
    
           For i = 1 To host.hLength
               ip_address = ip_address & temp_ip_address(i) & "."
           Next
           ip_address = Mid$(ip_address, 1, Len(ip_address) - 1)
    
           MsgBox hostname
           MsgBox ip_address
    
       End Sub
    
    

  4. Press the F5 key to run the project.

  5. Click Command1 to obtain the host information.

REFERENCES

For additional information, please see the following article in the Microsoft Knowledge Base:

   ARTICLE ID: Q154512
   TITLE     : SAMPLE: WINSOCK.EXE: Getting HostAddress Using Windows
               Sockets


KBCategory: kbusage kbhowto
KBSubcategory: APrgOther
Additional reference words: 4.00 kbstream vb4win vb432



THE INFORMATION PROVIDED IN THE MICROSOFT KNOWLEDGE BASE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. MICROSOFT DISCLAIMS ALL WARRANTIES, EITHER EXPRESS OR IMPLIED, INCLUDING THE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL MICROSOFT CORPORATION OR ITS SUPPLIERS BE LIABLE FOR ANY DAMAGES WHATSOEVER INCLUDING DIRECT, INDIRECT, INCIDENTAL, CONSEQUENTIAL, LOSS OF BUSINESS PROFITS OR SPECIAL DAMAGES, EVEN IF MICROSOFT CORPORATION OR ITS SUPPLIERS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. SOME STATES DO NOT ALLOW THE EXCLUSION OR LIMITATION OF LIABILITY FOR CONSEQUENTIAL OR INCIDENTAL DAMAGES SO THE FOREGOING LIMITATION MAY NOT APPLY.

Last reviewed: December 9, 1996
© 1998 Microsoft Corporation. All rights reserved. Terms of Use.