Winsock2.bas
Option ExplicitPublic Const MAX_WSADescription = 256
Public Const MAX_WSASYSStatus = 128
Public Const ERROR_SUCCESS       As Long = 0
Public Const WS_VERSION_REQD     As Long = &H101
Public Const WS_VERSION_MAJOR    As Long = WS_VERSION_REQD \ &H100 And &HFF&
Public Const WS_VERSION_MINOR    As Long = WS_VERSION_REQD And &HFF&
Public Const MIN_SOCKETS_REQD    As Long = 1
Public Const SOCKET_ERROR        As Long = -1Public Type HOSTENT
   hName      As Long
   hAliases   As Long
   hAddrType  As Integer
   hLen       As Integer
   hAddrList  As Long
End TypePublic Type WSADATA
   wVersion      As Integer
   wHighVersion  As Integer
   szDescription(0 To MAX_WSADescription)   As Byte
   szSystemStatus(0 To MAX_WSASYSStatus)    As Byte
   wMaxSockets   As Integer
   wMaxUDPDG     As Integer
   dwVendorInfo  As Long
End Type
Public Declare Function WSAGetLastError Lib "WSOCK32.DLL" () As LongPublic Declare Function WSAStartup Lib "WSOCK32.DLL" _
   (ByVal wVersionRequired As Long, lpWSADATA As WSADATA) As Long
   
Public Declare Function WSACleanup Lib "WSOCK32.DLL" () As LongPublic Declare Function gethostname Lib "WSOCK32.DLL" _
   (ByVal szHost As String, ByVal dwHostLen As Long) As Long
   
Public Declare Function gethostbyname Lib "WSOCK32.DLL" _
   (ByVal szHost As String) As Long
   
Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
   (hpvDest As Any, ByVal hpvSource As Long, ByVal cbCopy As Long)
Public Function GetIPAddress() As String   Dim sHostName    As String * 256
   Dim lpHost    As Long
   Dim HOST      As HOSTENT
   Dim dwIPAddr  As Long
   Dim tmpIPAddr() As Byte
   Dim i         As Integer
   Dim sIPAddr  As String
   
   If Not SocketsInitialize() Then
      GetIPAddress = ""
      Exit Function
   End If
   If gethostname(sHostName, 256) = SOCKET_ERROR Then
      GetIPAddress = ""
      MsgBox "Windows Sockets error " & Str$(WSAGetLastError()) & _
              " has occurred. Unable to successfully get Host Name."
      SocketsCleanup
      Exit Function
   End If
   sHostName = Trim$(sHostName)
   lpHost = gethostbyname(sHostName)
    
   If lpHost = 0 Then
      GetIPAddress = ""
      MsgBox "Windows Sockets are not responding. " & _
              "Unable to successfully get Host Name."
      SocketsCleanup
      Exit Function
   End If
   CopyMemory HOST, lpHost, Len(HOST)
   CopyMemory dwIPAddr, HOST.hAddrList, 4
   ReDim tmpIPAddr(1 To HOST.hLen)
   CopyMemory tmpIPAddr(1), dwIPAddr, HOST.hLen
   For i = 1 To HOST.hLen
      sIPAddr = sIPAddr & tmpIPAddr(i) & "."
   Next
   GetIPAddress = Mid$(sIPAddr, 1, Len(sIPAddr) - 1)
   
   SocketsCleanup
    
End FunctionPublic Function HiByte(ByVal wParam As Integer)    HiByte = wParam \ &H100 And &HFF&
 
End Function
Public Function LoByte(ByVal wParam As Integer)    LoByte = wParam And &HFF&End Function
Public Sub SocketsCleanup()    If WSACleanup() <> ERROR_SUCCESS Then
        MsgBox "Socket error occurred in Cleanup."
    End If
    
End SubPublic Function SocketsInitialize() As Boolean   Dim WSAD As WSADATA
   Dim sLoByte As String
   Dim sHiByte As String
   
   If WSAStartup(WS_VERSION_REQD, WSAD) <> ERROR_SUCCESS Then
      MsgBox "The 32-bit Windows Socket is not responding."
      SocketsInitialize = False
      Exit Function
   End If
   
   
   If WSAD.wMaxSockets < MIN_SOCKETS_REQD Then
        MsgBox "This application requires a minimum of " & _
                CStr(MIN_SOCKETS_REQD) & " supported sockets."
        
        SocketsInitialize = False
        Exit Function
   End If
   
   
   If LoByte(WSAD.wVersion) < WS_VERSION_MAJOR Or _
     (LoByte(WSAD.wVersion) = WS_VERSION_MAJOR And _
      HiByte(WSAD.wVersion) < WS_VERSION_MINOR) Then
      
      sHiByte = CStr(HiByte(WSAD.wVersion))
      sLoByte = CStr(LoByte(WSAD.wVersion))
      
      MsgBox "Sockets version " & sLoByte & "." & sHiByte & _
             " is not supported by 32-bit Windows Sockets."
      
      SocketsInitialize = False
      Exit Function
      
   End If
    SocketsInitialize = True
End Function
Private Sub Form_Load()
   Text1.Text = GetIPAddress()
   If Text1.Text = "127.0.0.1" Then
Label1.Caption = "You are of Line"
   Else
Label1.Caption = "You are on Line"
   End If
End Sub

解决方案 »

  1.   

    这些代码好像我见过了,不知如何才能返回所有的ip?因为一台机子上可能有多个ip地址
      

  2.   

     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$,_ 
         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 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. Press the F5 key to run the project. 
         
        5. Click Command1 to obtain the host information
       另外,请问什么时侯会出现你说的"一台机子上可能有多个ip地址"呢?
      

  3.   

    1 很多服务器都配有两个网卡,一个对外,一个对内,这时有两个ip地址
    2 在windows2000 server下一个网卡可以配置多个ip地址
    其他我就不太知道了。
    其实我的目的是这样的:
        我的一个安装程序需要配置iis,因此需要列出所有的ip地址给用户选择。
    (顺便问一个极其菜的问题:tcp端口是1-65536还是0-65535,还是别的? ^_^)
      

  4.   

    另外,下面这行代码少一个逻辑运算符,请问是什么?
    If lobyte(WSAD.wversion)  WS_VERSION_MAJOR And hibyte(WSAD.wversion) < WS_VERSION_MINOR Then你的代码很灵啊,谢谢。