| |||
Private Const MAX_WSADescription = 256 Private Const MAX_WSASYSStatus = 128 Private Const ERROR_SUCCESS As Long = 0 Private Const WS_VERSION_REQD As Long = &H101 Private Const WS_VERSION_MAJOR As Long = WS_VERSION_REQD \ &H100 And &HFF& Private Const WS_VERSION_MINOR As Long = WS_VERSION_REQD And &HFF& Private Const MIN_SOCKETS_REQD As Long = 1 Private Const SOCKET_ERROR As Long = -1 Private Type HOSTENT hName As Long hAliases As Long hAddrType As Integer hLen As Integer hAddrList As Long End Type Private 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 Private Declare Function WSAGetLastError Lib "WSOCK32.DLL" () As Long Private Declare Function WSAStartup Lib "WSOCK32.DLL" _ (ByVal wVersionRequired As Long, lpWSADATA As WSADATA) As Long Private Declare Function WSACleanup Lib "WSOCK32.DLL" () As Long Private Declare Function gethostname Lib "WSOCK32.DLL" _ (ByVal szHost As String, ByVal dwHostLen As Long) As Long Private Declare Function gethostbyname Lib "WSOCK32.DLL" _ (ByVal szHost As String) As Long Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _ (hpvDest As Any, ByVal hpvSource As Long, ByVal cbCopy As Long) Public 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 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 'must be OK, so lets do it SocketsInitialize = True End Function Public Sub SocketsCleanup() If WSACleanup() <> ERROR_SUCCESS Then 'MsgBox "Socket error occurred in Cleanup." End If End Sub 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 'GetHostName devuelve el nombre del local host en el buffer especificado por el 'parámetro name. El nombre se devuelve en un string acabado en null. El formato 'del nombre depende del driver de Windows Sockets - puede ser un simple nombre o 'puede ser un nombre de dominio plenamente cualificado. De todas formas, está 'garantizado que el nombre puede ser tratado por las funciones GetHostByName y 'WSAAsyncGetHostByName. 'En esta aplicación, si el nombre no ha sido configurado, GetHostName devolverá 'un nombre que GetHostByName y WSAAsyncGetHostByName pueden resolver. 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 'GetHostByName devuelve un puntero a la estructura HOSTENT - una estructura 'creada por Windows Socktes. Dicha estructura contiene el resultado de una 'búsqueda con éxito del host especificado en el parámetro name. 'La aplicación nunca debe intentar modificar esta estructura ni ninguno de 'sus componentes. Sólo hay una copia de la estructura por cada thread y la 'aplicación puede copiar cualquier información que necesite antes de llamar 'a otra función de Windows Sockets. 'La función GetHostByName no puede resolver direcciones IP en formato string. 'Usa la función Inet_Addr para convertir un string con una dirección IP y luego 'emplea la función GetHostByAddr para obtener los contenidos de la estructura 'HOSTENT. 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 'para extraer la dirección IP devuelta, tenemos que hacer una copia de la estructura 'HOST y de sus componentes CopyMemory HOST, lpHost, Len(HOST) CopyMemory dwIPAddr, HOST.hAddrList, 4 'creamos un array para recoger el resultado ReDim tmpIPAddr(1 To HOST.hLen) CopyMemory tmpIPAddr(1), dwIPAddr, HOST.hLen 'y con el array, construimos la dirección añadiendo un punto entre los miembros For i = 1 To HOST.hLen sIPAddr = sIPAddr & tmpIPAddr(i) & "." Next 'la rutina añade un punto al final del string, lo quitamos GetIPAddress = Mid$(sIPAddr, 1, Len(sIPAddr) - 1) SocketsCleanup End Function Private Sub Form_Load() Text1.Text = GetIPAddress End Sub |