您的位置:首页 > 编程语言 > VB

VB6获取本机所有IP地址公用函数

2013-03-25 14:28 369 查看
因为正好有用到,整了个公用函数,一次获取本机全部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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: