热情软件屋

 

如何获得本地计算机的IP地址


编号:QA000616
建立日期: 1999年3月9日 最后修改日期:2002年3月25日
所属类别:

Chees:
    VB5 (sp3)
    Win98
    当我使用VB5.0编程时,我如何获得我的计算机的IP地址?使用哪个API?

回答:

    应该调用WinSock的几个函数。先使用gethostname获得本机的名字,然后使用gethostbyname得到IP地址。下面的例子摘自微软的Knowledge Base的文章:“Q160215 OWTO: Obtain the Host IP Address Using Windows Sockets”
    1. 启动Visual Basic,将建立Form1。
    2. 放置按钮Command1在Form1上。
    3. 在 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$,_
     ByVal HostLen as Long) 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
    
     'iMaxSockets is not used in winsock 2. So the following check is only
     'necessary for winsock 1. If winsock 2 is requested,
     'the following check can be skipped.
    
     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
    
     MsgBox hostname
    
     'get all of the IP address if machine is multi-homed
    
     Do
     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 ip_address
    
     ip_address = ""
     host.hAddrList = host.hAddrList + LenB(host.hAddrList)
     RtlMoveMemory hostip_addr, host.hAddrList, 4
     Loop While (hostip_addr <> 0)
    
     End Sub
    

    
    4. 按F5键运行程序。
    5. 点击Command1获得主机信息。
    
    Forever的意见:
    你只要用一个Winsock控件然后读它的LocalIP就可以返回你主机的IP地址。

此问题由李海回答。

 
把这个问题推荐给朋友
   
   
您的意见类别
您的名字
您的电子邮件
您的建议(请尽可能详细)
 
 

版权所有 1997-2008 热情软件屋
如果您有任何建议和意见, 请给我发个电子邮件 askpro@china-askpro.com
Web Designed by ZebraStudio