Cómo usar Winsock en VB para obtener la IP de la red externa y conectarse a la red externa
Opción explícita
Const privada WS_VERSION_REQD = &H101
Const privada WS_VERSION_MAJOR = WS_VERSION_REQD \ &H100 y &HFF&
Const privada WS_VERSION_MINOR = WS_VERSION_REQD y &HFF&
Const privada MIN_SOCKETS_REQD = 1
Const privada SOCKET_ERROR = -1
Const privada WSADescription_Len = 256
Const privada WSASYS_Status_Len = 128
Tipo Privado HOSTENT
hName Mientras
hAliases Mientras
hAddrType Como Entero
hLength Como Entero
hAddrList As Long
Tipo final
Tipo privado WSADATA
wversion As Integer
wHighVersion As Integer
szDescription(0 a WSADescription_Len) como byte
szSystemStatus(0 a WSASYS_Status_Len) como byte
iMaxSockets como entero
iMaxUdpDg como entero
lpszVendorInfo siempre
Tipo final
Función de declaración privada WSAGetLastError Lib "WSOCK32.DLL" () Mientras
Función de declaración privada WSAStartup Lib "WSOCK32.DLL" (ByVal _
wVersionRequired&, lpWSAData As WSADATA) Mientras
Función de declaración privada WSACleanup Lib "WSOCK32.DLL" () Mientras
Función de declaración privada gethostname Lib "WSOCK32.DLL" (ByVal hostname$, ByVal HostLen As Long) Siempre
Función de declaración privada gethostbyname Lib "WSOCK32.DLL" (ByVal _
nombre de host$) Siempre
Declaración privada Sub RtlMoveMemory Lib "KERNEL32" (hpvDest como cualquiera, ByVal hpv
Source&, ByVal cbCopy&)
Función hibyte(ByVal wParam As Integer)
hibyte = wParam \ &H100 And &HFF&
Función final
Función lobyte(ByVal wParam As Integer)
lobyte = wParam And &HFF&
Función final
Sub SocketsInitialize()
Dim WSAD As WSADATA
Atenuar iReturn como entero
Atenuar slowByte como cadena, sHighByte como cadena, sMsg como cadena
iReturn = WSAStartup(WS_VERSION_REQD, WSAD)
Si iReturn <> 0 Entonces
MsgBox "Winsock.dll no responde".
Fin
Fin
Si lobyte(WSAD.wversion) < WS_VERSION_MAJOR O (lobyte(WSAD.wversion) = _
WS_VERSION_MAJOR Y hibyte(WSAD.wversion) < WS_VERSION_MINOR) Entonces
sHighByte = Trim$( str$(hibyte(WSAD.wversion)))
sLowByte = Trim$(str$(lobyte(WSAD.wversion)))
sMsg = "Versión de Windows Sockets " & sLowByte & "." & sHighByte
sMsg = sMsg & " no es compatible con winsock.dll "
MsgBox sMsg
Fin
Finalizar si
'iMaxSockets no se usa en winsock 2. Por lo tanto, la siguiente verificación solo es
'necesaria para winsock 1. Si se solicita winsock 2,
'Se puede omitir la siguiente verificación
Si WSAD.iMaxSockets < MIN_SOCKETS_REQD Entonces
sMsg = "Esta aplicación requiere un mínimo de "
sMsg = sMsg &. Trim$(str$(MIN_SOCKETS_REQD)) & "sockets compatibles."
MsgBox sMsg
End
End If
End Sub
>
Sub SocketsCleanup()
Dim lReturn As Long
lReturn = WSACleanup()
Si lReturn <> 0 Entonces
MsgBox "Error de socket " & Trim$(str$(lReturn)) & " ocurrió en la limpieza "
End
End If
End Sub p>
p>
Sub Form_Load()
SocketsInitialize
End Sub
Sub privado Form_Unload(Cancelar como entero)
SocketsCleanup
End Sub
Private Sub Command1_click()
Dim hostname As String * 256
Dim hostent_addr As Long
Atenuar host como HOSTENT
Atenuar hostip_addr mientras
Atenuar temp_ip_address() como byte
Atenuar i como entero
Dim ip_address As String
Si gethostname(hostname, 256) = SOCKET_ERROR Entonces
MsgBox "Error de Windows Sockets " & str(WSAGetLastError())
Salir de Sub
Else
nombre de host = Trim$(nombre de host)
Fin si
hostent_addr = gethostbyname(nombre de host)
Si hostent_addr = 0 Entonces
MsgBox "Winsock.dll no responde."
Salir de Sub
Finalizar si
RtlMoveMemory host, hostent_addr, LenB(host)
RtlMoveMemory hostip_addr, host.hAddrList, 4
nombre de host de MsgBox
'obtiene toda la dirección IP si la máquina está multi-homed
p>
Hacer
ReDim temp_ip_address(1 To host.hLength)
RtlMoveMemory temp_ip_address(1), hostip_addr, host.hLength
Para i = 1 Hasta host.hLength
dirección_ip = dirección_ip & dirección_ip_temp(i) & "."
Siguiente
dirección_ip = Medio$(ip_a
dirección, 1, Len(dirección_ip) - 1)
MsgBox dirección_ip
dirección_ip = ""
host.hAddrList = host.hAddrList + LenB(host. hAddrList)
RtlMoveMemory hostip_addr, host.hAddrList, 4
Bucle Mientras (hostip_addr <> 0)
Fin Sub