Red de conocimiento informático - Material del sitio web - Cómo usar Winsock en VB para obtener la IP de la red externa y conectarse a la red externa

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>

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