zoukankan      html  css  js  c++  java
  • VB6获取本机所有IP地址公用函数

    因为正好有用到,整了个公用函数,一次获取本机全部IP地址:

    Option Explicit
    
    Private Declare Function WSAstartup Lib "WSOCK32.DLL" Alias "WSAStartup" (ByVal wVersionRequired As Integer, ByRef lpWSAData As WSAdata) As Long
    Private Declare Function WsACleanup Lib "WSOCK32.DLL" Alias "WSACleanup" () As Long
    Private Declare Function WSAIoctl Lib "ws2_32.dll" (ByVal s As Long, ByVal dwIoControlCode As Long, lpvInBuffer As Any, ByVal cbInBuffer As Long, lpvOutBuffer As Any, ByVal cbOutBuffer As Long, lpcbBytesReturned As Long, lpOverlapped As Long, lpCompletionRoutine As Long) As Long
    Private Declare Function socket Lib "WSOCK32.DLL" (ByVal af As Long, ByVal s_type As Long, ByVal protocol As Long) As Long
    Private Declare Function closesocket Lib "WSOCK32.DLL" (ByVal s As Long) As Long
    Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
    
    Private Type sockaddr
        sin_family As Integer
        sin_port As Integer
        sin_addr As Long
        sin_zero As String * 8
    End Type
    
    Private Type sockaddr_gen
        AddressIn As sockaddr
        filler(0 To 7) As Byte
    End Type
    
    Private Type INTERFACE_INFO
        iiFlags As Long
        iiAddress As sockaddr_gen
        iiBroadcastAddress As sockaddr_gen
        iiNetmask As sockaddr_gen
    End Type
    
    Private Type INTERFACEINFO
        iInfo(0 To 7) As INTERFACE_INFO
    End Type
    
    Private Type WSAdata
        wVersion As Integer
        wHighVersion As Integer
        szDescription As String * 255
        szSystemStatus As String * 128
        iMaxSockets As Integer
        iMaxUdpDg As Integer
        lpVendorInfo As Long
    End Type
    
    Private Const AF_INET = 2
    Private Const SOCK_STREAM = 1
    Private Const INVALID_SOCKET = -1
    Private Const SIO_GET_INTERFACE_LIST As Long = &H4004747F
    
    Private Function GetStrIPFromLong(nIP As Long) As String
        On Error Resume Next
        Dim btBuffer(3) As Byte
        Call CopyMemory(ByVal VarPtr(btBuffer(0)), ByVal VarPtr(nIP), 4)
        Let GetStrIPFromLong = btBuffer(0) & "." & btBuffer(1) & "." & btBuffer(2) & "." & btBuffer(3)
    End Function
    
    Public Function EnumLocalIpAddress() As String()
        On Error GoTo Z
        Dim lngSocketHandle       As Long
        Dim lngBytesReturned      As Long
        Dim tpBuffer              As INTERFACEINFO
        Dim nNumInterfaces        As Integer
        Dim i                     As Integer
        Dim StartupInfo           As WSAdata
        Dim strIPBuffer()         As String
    
        If WSAstartup(&H202, StartupInfo) <> 0 Then
           Exit Function
        End If
        
        lngSocketHandle = socket(AF_INET, SOCK_STREAM, 0)
        If lngSocketHandle = INVALID_SOCKET Then
           Exit Function
        End If
        
        If WSAIoctl(lngSocketHandle, SIO_GET_INTERFACE_LIST, ByVal 0, ByVal 0, tpBuffer, 1024, lngBytesReturned, ByVal 0, ByVal 0) Then
           closesocket lngSocketHandle
           Exit Function
        End If
    
        nNumInterfaces = CInt(lngBytesReturned / 76)
        
        ReDim strIPBuffer(nNumInterfaces - 1)
        
        For i = 0 To nNumInterfaces - 1
            strIPBuffer(i) = GetStrIPFromLong(tpBuffer.iInfo(i).iiAddress.AddressIn.sin_addr)
        Next i
        
        EnumLocalIpAddress = strIPBuffer
        closesocket lngSocketHandle
        WsACleanup
        Exit Function
    Z:
    End Function
    
    


    使用很简单:

        Dim i As Long, strIPAdd() As String
        strIPAdd = EnumLocalIpAddress
        If SafeArrayGetDim(strIPAdd) > 0 Then
           For i = 0 To UBound(strIPAdd)
               Debug.Print strIPAdd(i)
           Next
        End If
    


     

  • 相关阅读:
    网页中插入Flash动画(.swf)代码和常用参数设置
    关于UML中逻辑模型的工具的详细介绍
    简单CSS hack:区分IE6、IE7、IE8、Firefox、Opera
    mysql sock找不到
    简述nginx日志管理切割日志(亲测可行)
    Linux下使用rm删除文件,并排除指定文件(亲测可行)
    常驻内存以及如何避免内存泄漏
    TASK异步进程处理场景
    TCP长连接数据传输(同步方式)
    在智联上投了一个月的简历,很多都有意向,但是却没有通知我去
  • 原文地址:https://www.cnblogs.com/xinyuyuanm/p/2980722.html
Copyright © 2011-2022 走看看