proyecto que se quiera usar winsock y así no usamos fastidiosos OCX's
Código:
'<el codigo empieza justo despues de esta etiqueta>
Option Explicit
'Funciones PUBLICAS en este modulo:
'
'IniciarSesionSocket
'TeminarSesionSocket
'CrearSocket
'CerrarSocket
'Conectar
'Recibir
'Enviar
'EstadoSocket <-- no da buenos resultados
'MensajeEntrante
'
'(NOTA: estan declaradas en el orden mostrado)
'
'Ademas hay una variable publica booleana que indica si winsock fue iniciado
'(Public WinsockIniciado As Boolean)
'
Private Declare Function WSAStartup Lib "ws2_32.dll" (ByVal wVersionRequired As Long, _
lpWSAData As WSAData) As Long
Private Declare Function WSACleanup Lib "ws2_32.dll" () As Long
Private Declare Function Socket Lib "ws2_32.dll" Alias "socket" (ByVal Familia As Long, _
ByVal Tipo As Long, _
ByVal Protocolo As Long) As Long
Private Declare Function closesocket Lib "ws2_32.dll" (ByVal s As Long) As Long
Private Declare Function htons Lib "ws2_32.dll" (ByVal hostshort As Integer) As Integer
Private Declare Function gethostbyname Lib "ws2_32.dll" (ByVal host_name As String) As Long
Private Declare Sub RtlMoveMemory Lib "kernel32" (hpvDest As Any, _
ByVal hpvSource As Long, _
ByVal cbCopy As Long)
Private Declare Function connect Lib "ws2_32.dll" (ByVal s As Long, _
ByRef name As sockaddr_in, _
ByVal namelen As Long) As Long
Private Declare Function recv Lib "wsock32.dll" (ByVal s As Long, _
buf As Any, _
ByVal buflen As Long, _
ByVal flags As Long) As Long
Private Declare Function send Lib "ws2_32.dll" (ByVal s As Long, _
ByRef buf As Any, _
ByVal buflen As Long, _
ByVal flags As Long) As Long
Private Declare Function vbselect Lib "ws2_32.dll" Alias "select" (ByVal nfds As Long, _
ByRef readfds As Any, _
ByRef writefds As Any, _
ByRef exceptfds As Any, _
ByRef timeout As Long) As Long
Private Type WSAData
Version As Integer
MayorVersion As Integer
Descripcion As String * 257
EstadoDelSistema As String * 129
MaximosSockets As Integer
MaximaUPDData As Integer
InfoDelVendedor As Long
End Type
Private Type HOSTENT
Nombre As Long
Alias As Long
TipoDeDireccion As Integer
Longitud As Integer
ListaDeDirecciones As Long
End Type
Private Type sockaddr_in
Familia As Integer
Puerto As Integer
Direccion As Long
Cero(1 To 8) As Byte
End Type
Private Type fd_set
Contador As Long 'Cuantos sockets estan en este estado?
Arreglo(1 To 64) As Long 'Arreglo con los manejadores en cuestion.
End Type
'esta es una bandera usada para cuando se llama a TeminarSesionSocket
'para saber si la sesion fue iniciada o no (en tal caso no abria que terminar nada)
Private WinsockIniciado As Boolean
'*****************************************************************
'*****************************************************************
'*****************************************************************
Public Function IniciarSesionSocket() As Boolean
'IniciarSesionSocket por ACHERNAR 7/2007
'para el foro de www.elhacker.net
'
'La funcion inicia una sesion socket
'si todo sale bien retorna True
'Si hay error retorna False
Dim MiEstructuraWinsockData As WSAData
Dim Retorno As Long
Retorno = WSAStartup(&H202, MiEstructuraWinsockData)
If Retorno = 0 Then
WinsockIniciado = True
IniciarSesionSocket = True
Else
WinsockIniciado = False
IniciarSesionSocket = False
End If
End Function
Public Function TeminarSesionSocket()
'TeminarSesionSocket por ACHERNAR 7/2007
'para el foro de www.elhacker.net
'
'Termina sesion Winsock
If WinsockIniciado Then
WSACleanup
End If
End Function
'*****************************************************************
'*****************************************************************
'*****************************************************************
Public Function CrearSocket() As Long
'CrearSocket por ACHERNAR 7/2007
'para el foro de www.elhacker.net
'
'La funcion abre un socket AF_INET , SOCK_STREAM, IPROTO_TCP
'si no hay errores retorna un manejador del socket > 0,
'si hubo errores retorna cero
CrearSocket = Socket(2, 1, 6)
If CrearSocket <= 0 Then
CrearSocket = 0
End If
End Function
Public Function CerrarSocket(ByVal ManejadorSocket As Long) As Boolean
'CerrarSocket por ACHERNAR 7/2007
'para el foro de www.elhacker.net
'
'La Funcion cierra un socket abierto
'Si todo sale bien retorna True
'Si hay error retorna False
If Not closesocket(ManejadorSocket) Then
CerrarSocket = True
Else
CerrarSocket = False
End If
End Function
'*****************************************************************
'*****************************************************************
'*****************************************************************
Private Function CambiarOrdenamiento(ByVal Valor As Long) As Integer
'CambiarOrdenamiento por ACHERNAR 7/2007
'para el foro de www.elhacker.net
'
If Not Valor <= 32767 Then
Valor = Valor - 65536
End If
CambiarOrdenamiento = htons(Valor)
End Function
'*****************************************************************
'*****************************************************************
'*****************************************************************
Private Function ObtenerIPDelNombre(ByVal Nombre As String) As Long
'ObtenerIPDelNombre por ACHERNAR 7/2007
'para el foro de www.elhacker.net
'
Dim PunteroAEstructura As Long
Dim PunteroAUnaIP As Long
Dim MiEstructuraHOSTENT As HOSTENT
Dim DireccionIP As Long
PunteroAEstructura = gethostbyname(Trim$(Nombre))
If PunteroAEstructura = 0 Then
DireccionIP = 0
Else
RtlMoveMemory MiEstructuraHOSTENT, PunteroAEstructura, LenB(MiEstructuraHOSTENT)
'
'ahora MiEstructuraHOSTENT.ListaDeDirecciones contiene un arreglo de direccion IP
'y es necesario obtener un puntero a la primera IP del arreglo
'
RtlMoveMemory PunteroAUnaIP, MiEstructuraHOSTENT.ListaDeDirecciones, 4
If Not PunteroAUnaIP = 0 Then
'
'Paso los valores de la IP a una variable Long
'
RtlMoveMemory DireccionIP, PunteroAUnaIP, MiEstructuraHOSTENT.Longitud
'
Else
DireccionIP = 0
End If
End If
ObtenerIPDelNombre = DireccionIP
End Function
'*****************************************************************
'*****************************************************************
'*****************************************************************
Public Function Conectar(ByVal ManejadorSocket As Long, _
ByVal NombreHost_IP As String, _
ByVal PuertoRemoto As Long, _
IP As Boolean) As Long
'Conectar por ACHERNAR 7/2007
'para el foro de www.elhacker.net
'
'Esta funcion realiza una conexión a un host remoto
'si el argumento ip es true es que el argumento NombreHost_IP contiene una ip
'si el argumento ip es false es que el argumento NombreHost_IP contiene el
'nombre del host
'Si todo sale bien retorona True
'Si hay error retorna False
Dim EstructuraDireccion As sockaddr_in
Dim Posicion1 As Integer
Dim Posicion2 As Integer
Dim IpNumero As Long
Dim i As Integer
If IP = True Then
Posicion1 = 1
IpNumero = 0
For i = 1 To 4
Posicion2 = InStr(Posicion1, NombreHost_IP, ".", vbBinaryCompare)
If Posicion2 = 0 Then
Posicion2 = Len(NombreHost_IP) + 1
End If
IpNumero = IpNumero + CLng(Mid(NombreHost_IP, Posicion1, _
Posicion2 - Posicion1)) * 256 ^ (i - 1)
Posicion1 = Posicion2 + 1
Next i
EstructuraDireccion.Direccion = IpNumero
Else
EstructuraDireccion.Direccion = ObtenerIPDelNombre(NombreHost_IP)
End If
EstructuraDireccion.Familia = 2
EstructuraDireccion.Puerto = CambiarOrdenamiento(PuertoRemoto)
If connect(ManejadorSocket, EstructuraDireccion, Len(EstructuraDireccion)) Then
Conectar = False
Else
Conectar = True
End If
End Function
'*****************************************************************
'*****************************************************************
'*****************************************************************
Public Function Recibir(ByVal ManejadorSocket As Long, _
StringBuffer As String) As Long
'ObtenerIPDelNombre por ACHERNAR 7/2007
'para el foro de www.elhacker.net
'
'Esta funcion coloca los datos que arriban en un buffer
'Si no hay errores retorna un valor mayor que cero
'que es la cantidad de bytes recibidos
Dim ByteBuffer(1 To 8192) As Byte
Dim BytesRecibidos As Long
BytesRecibidos = recv(ManejadorSocket, ByteBuffer(1), 8192, 0&)
If BytesRecibidos > 0 Then
StringBuffer = StrConv(ByteBuffer, vbUnicode)
StringBuffer = Left$(StringBuffer, BytesRecibidos)
End If
Recibir = BytesRecibidos
End Function
Public Function Enviar(ByVal ManejadorSocket As Long, _
StringBuffer As String) As Long
'ObtenerIPDelNombre por ACHERNAR 7/2007
'para el foro de www.elhacker.net
'
'Esta funcion envia los datos colocados en el buffer
'Si no hay errores retorna un valor mayor que cero
'que es la cantidad de bytes enviados
Dim ByteBuffer() As Byte
Dim BytesAEnviar As Long
Dim BytesEnviados As Long
BytesAEnviar = Len(StringBuffer)
If BytesAEnviar > 0 Then
ByteBuffer = StrConv(StringBuffer, vbFromUnicode)
BytesEnviados = send(ManejadorSocket, ByteBuffer(0), BytesAEnviar, 0&)
Enviar = BytesEnviados
Else
Enviar = 0
End If
End Function
Public Function EstadoSocket(ByVal Manejador As Long) As Integer
'EstadoSocket por ACHERNAR 7/2007
'para el foro de www.elhacker.net
'
'esta funcion muestra el estado de un socket
'retorna valores entre 0 y 7
' 0 - Desconectado
' 1 - Lectura(se puede leer)
' 2 - Escritura(se puede escribir)
' 3 - Lectura y Escritura
' 4 - Error
' 5 - Error y Lectura
' 6 - Error y Escritura
' 7 - Error, Lectura y Escritura
Dim Retorno As Long
Dim Lectura As fd_set
Dim Escritura As fd_set
Dim Error As fd_set
Lectura.Contador = 1
Escritura.Contador = 1
Error.Contador = 1
Lectura.Arreglo(1) = Manejador
Escritura.Arreglo(1) = Manejador
Error.Arreglo(1) = Manejador
Retorno = vbselect(0&, Lectura, Escritura, Error, 0&)
If Retorno <= 0 Then
EstadoSocket = 0
GoTo Final
Else
'
'Si el socket se encuentra en estado de Lectura, Escritura o Error
'la funcion vbSelect retorna un valor MAYOR que cero (0)
'
If Lectura.Contador > 0 Then
EstadoSocket = EstadoSocket + 1
End If
If Escritura.Contador > 0 Then
EstadoSocket = EstadoSocket + 2
End If
If Error.Contador > 0 Then
EstadoSocket = EstadoSocket + 4
End If
End If
Final:
End Function
Public Function MensajeEntrante(Socket As Long) As Boolean
'MensajeEntrante por ACHERNAR 7/2007
'para el foro de www.elhacker.net
'
'Esta funcion indica si el socket está en estado
'De Lectura. si lo está retorna True.
'Si no hay datos para leer en el socket retorna False.
MensajeEntrante = False
Select Case EstadoSocket(Socket)
Case Is = 1
MensajeEntrante = True
Case Is = 3
MensajeEntrante = True
Case Is = 5
MensajeEntrante = True
Case Is = 7
MensajeEntrante = True
End Select
End Function
'*****************************************************************
'*****************************************************************
'*****************************************************************
'<el codigo termino justo antes de esta etiqueta>
Option Explicit
'Funciones PUBLICAS en este modulo:
'
'IniciarSesionSocket
'TeminarSesionSocket
'CrearSocket
'CerrarSocket
'Conectar
'Recibir
'Enviar
'EstadoSocket <-- no da buenos resultados
'MensajeEntrante
'
'(NOTA: estan declaradas en el orden mostrado)
'
'Ademas hay una variable publica booleana que indica si winsock fue iniciado
'(Public WinsockIniciado As Boolean)
'
Private Declare Function WSAStartup Lib "ws2_32.dll" (ByVal wVersionRequired As Long, _
lpWSAData As WSAData) As Long
Private Declare Function WSACleanup Lib "ws2_32.dll" () As Long
Private Declare Function Socket Lib "ws2_32.dll" Alias "socket" (ByVal Familia As Long, _
ByVal Tipo As Long, _
ByVal Protocolo As Long) As Long
Private Declare Function closesocket Lib "ws2_32.dll" (ByVal s As Long) As Long
Private Declare Function htons Lib "ws2_32.dll" (ByVal hostshort As Integer) As Integer
Private Declare Function gethostbyname Lib "ws2_32.dll" (ByVal host_name As String) As Long
Private Declare Sub RtlMoveMemory Lib "kernel32" (hpvDest As Any, _
ByVal hpvSource As Long, _
ByVal cbCopy As Long)
Private Declare Function connect Lib "ws2_32.dll" (ByVal s As Long, _
ByRef name As sockaddr_in, _
ByVal namelen As Long) As Long
Private Declare Function recv Lib "wsock32.dll" (ByVal s As Long, _
buf As Any, _
ByVal buflen As Long, _
ByVal flags As Long) As Long
Private Declare Function send Lib "ws2_32.dll" (ByVal s As Long, _
ByRef buf As Any, _
ByVal buflen As Long, _
ByVal flags As Long) As Long
Private Declare Function vbselect Lib "ws2_32.dll" Alias "select" (ByVal nfds As Long, _
ByRef readfds As Any, _
ByRef writefds As Any, _
ByRef exceptfds As Any, _
ByRef timeout As Long) As Long
Private Type WSAData
Version As Integer
MayorVersion As Integer
Descripcion As String * 257
EstadoDelSistema As String * 129
MaximosSockets As Integer
MaximaUPDData As Integer
InfoDelVendedor As Long
End Type
Private Type HOSTENT
Nombre As Long
Alias As Long
TipoDeDireccion As Integer
Longitud As Integer
ListaDeDirecciones As Long
End Type
Private Type sockaddr_in
Familia As Integer
Puerto As Integer
Direccion As Long
Cero(1 To 8) As Byte
End Type
Private Type fd_set
Contador As Long 'Cuantos sockets estan en este estado?
Arreglo(1 To 64) As Long 'Arreglo con los manejadores en cuestion.
End Type
'esta es una bandera usada para cuando se llama a TeminarSesionSocket
'para saber si la sesion fue iniciada o no (en tal caso no abria que terminar nada)
Private WinsockIniciado As Boolean
'*****************************************************************
'*****************************************************************
'*****************************************************************
Public Function IniciarSesionSocket() As Boolean
'IniciarSesionSocket por ACHERNAR 7/2007
'para el foro de www.elhacker.net
'
'La funcion inicia una sesion socket
'si todo sale bien retorna True
'Si hay error retorna False
Dim MiEstructuraWinsockData As WSAData
Dim Retorno As Long
Retorno = WSAStartup(&H202, MiEstructuraWinsockData)
If Retorno = 0 Then
WinsockIniciado = True
IniciarSesionSocket = True
Else
WinsockIniciado = False
IniciarSesionSocket = False
End If
End Function
Public Function TeminarSesionSocket()
'TeminarSesionSocket por ACHERNAR 7/2007
'para el foro de www.elhacker.net
'
'Termina sesion Winsock
If WinsockIniciado Then
WSACleanup
End If
End Function
'*****************************************************************
'*****************************************************************
'*****************************************************************
Public Function CrearSocket() As Long
'CrearSocket por ACHERNAR 7/2007
'para el foro de www.elhacker.net
'
'La funcion abre un socket AF_INET , SOCK_STREAM, IPROTO_TCP
'si no hay errores retorna un manejador del socket > 0,
'si hubo errores retorna cero
CrearSocket = Socket(2, 1, 6)
If CrearSocket <= 0 Then
CrearSocket = 0
End If
End Function
Public Function CerrarSocket(ByVal ManejadorSocket As Long) As Boolean
'CerrarSocket por ACHERNAR 7/2007
'para el foro de www.elhacker.net
'
'La Funcion cierra un socket abierto
'Si todo sale bien retorna True
'Si hay error retorna False
If Not closesocket(ManejadorSocket) Then
CerrarSocket = True
Else
CerrarSocket = False
End If
End Function
'*****************************************************************
'*****************************************************************
'*****************************************************************
Private Function CambiarOrdenamiento(ByVal Valor As Long) As Integer
'CambiarOrdenamiento por ACHERNAR 7/2007
'para el foro de www.elhacker.net
'
If Not Valor <= 32767 Then
Valor = Valor - 65536
End If
CambiarOrdenamiento = htons(Valor)
End Function
'*****************************************************************
'*****************************************************************
'*****************************************************************
Private Function ObtenerIPDelNombre(ByVal Nombre As String) As Long
'ObtenerIPDelNombre por ACHERNAR 7/2007
'para el foro de www.elhacker.net
'
Dim PunteroAEstructura As Long
Dim PunteroAUnaIP As Long
Dim MiEstructuraHOSTENT As HOSTENT
Dim DireccionIP As Long
PunteroAEstructura = gethostbyname(Trim$(Nombre))
If PunteroAEstructura = 0 Then
DireccionIP = 0
Else
RtlMoveMemory MiEstructuraHOSTENT, PunteroAEstructura, LenB(MiEstructuraHOSTENT)
'
'ahora MiEstructuraHOSTENT.ListaDeDirecciones contiene un arreglo de direccion IP
'y es necesario obtener un puntero a la primera IP del arreglo
'
RtlMoveMemory PunteroAUnaIP, MiEstructuraHOSTENT.ListaDeDirecciones, 4
If Not PunteroAUnaIP = 0 Then
'
'Paso los valores de la IP a una variable Long
'
RtlMoveMemory DireccionIP, PunteroAUnaIP, MiEstructuraHOSTENT.Longitud
'
Else
DireccionIP = 0
End If
End If
ObtenerIPDelNombre = DireccionIP
End Function
'*****************************************************************
'*****************************************************************
'*****************************************************************
Public Function Conectar(ByVal ManejadorSocket As Long, _
ByVal NombreHost_IP As String, _
ByVal PuertoRemoto As Long, _
IP As Boolean) As Long
'Conectar por ACHERNAR 7/2007
'para el foro de www.elhacker.net
'
'Esta funcion realiza una conexión a un host remoto
'si el argumento ip es true es que el argumento NombreHost_IP contiene una ip
'si el argumento ip es false es que el argumento NombreHost_IP contiene el
'nombre del host
'Si todo sale bien retorona True
'Si hay error retorna False
Dim EstructuraDireccion As sockaddr_in
Dim Posicion1 As Integer
Dim Posicion2 As Integer
Dim IpNumero As Long
Dim i As Integer
If IP = True Then
Posicion1 = 1
IpNumero = 0
For i = 1 To 4
Posicion2 = InStr(Posicion1, NombreHost_IP, ".", vbBinaryCompare)
If Posicion2 = 0 Then
Posicion2 = Len(NombreHost_IP) + 1
End If
IpNumero = IpNumero + CLng(Mid(NombreHost_IP, Posicion1, _
Posicion2 - Posicion1)) * 256 ^ (i - 1)
Posicion1 = Posicion2 + 1
Next i
EstructuraDireccion.Direccion = IpNumero
Else
EstructuraDireccion.Direccion = ObtenerIPDelNombre(NombreHost_IP)
End If
EstructuraDireccion.Familia = 2
EstructuraDireccion.Puerto = CambiarOrdenamiento(PuertoRemoto)
If connect(ManejadorSocket, EstructuraDireccion, Len(EstructuraDireccion)) Then
Conectar = False
Else
Conectar = True
End If
End Function
'*****************************************************************
'*****************************************************************
'*****************************************************************
Public Function Recibir(ByVal ManejadorSocket As Long, _
StringBuffer As String) As Long
'ObtenerIPDelNombre por ACHERNAR 7/2007
'para el foro de www.elhacker.net
'
'Esta funcion coloca los datos que arriban en un buffer
'Si no hay errores retorna un valor mayor que cero
'que es la cantidad de bytes recibidos
Dim ByteBuffer(1 To 8192) As Byte
Dim BytesRecibidos As Long
BytesRecibidos = recv(ManejadorSocket, ByteBuffer(1), 8192, 0&)
If BytesRecibidos > 0 Then
StringBuffer = StrConv(ByteBuffer, vbUnicode)
StringBuffer = Left$(StringBuffer, BytesRecibidos)
End If
Recibir = BytesRecibidos
End Function
Public Function Enviar(ByVal ManejadorSocket As Long, _
StringBuffer As String) As Long
'ObtenerIPDelNombre por ACHERNAR 7/2007
'para el foro de www.elhacker.net
'
'Esta funcion envia los datos colocados en el buffer
'Si no hay errores retorna un valor mayor que cero
'que es la cantidad de bytes enviados
Dim ByteBuffer() As Byte
Dim BytesAEnviar As Long
Dim BytesEnviados As Long
BytesAEnviar = Len(StringBuffer)
If BytesAEnviar > 0 Then
ByteBuffer = StrConv(StringBuffer, vbFromUnicode)
BytesEnviados = send(ManejadorSocket, ByteBuffer(0), BytesAEnviar, 0&)
Enviar = BytesEnviados
Else
Enviar = 0
End If
End Function
Public Function EstadoSocket(ByVal Manejador As Long) As Integer
'EstadoSocket por ACHERNAR 7/2007
'para el foro de www.elhacker.net
'
'esta funcion muestra el estado de un socket
'retorna valores entre 0 y 7
' 0 - Desconectado
' 1 - Lectura(se puede leer)
' 2 - Escritura(se puede escribir)
' 3 - Lectura y Escritura
' 4 - Error
' 5 - Error y Lectura
' 6 - Error y Escritura
' 7 - Error, Lectura y Escritura
Dim Retorno As Long
Dim Lectura As fd_set
Dim Escritura As fd_set
Dim Error As fd_set
Lectura.Contador = 1
Escritura.Contador = 1
Error.Contador = 1
Lectura.Arreglo(1) = Manejador
Escritura.Arreglo(1) = Manejador
Error.Arreglo(1) = Manejador
Retorno = vbselect(0&, Lectura, Escritura, Error, 0&)
If Retorno <= 0 Then
EstadoSocket = 0
GoTo Final
Else
'
'Si el socket se encuentra en estado de Lectura, Escritura o Error
'la funcion vbSelect retorna un valor MAYOR que cero (0)
'
If Lectura.Contador > 0 Then
EstadoSocket = EstadoSocket + 1
End If
If Escritura.Contador > 0 Then
EstadoSocket = EstadoSocket + 2
End If
If Error.Contador > 0 Then
EstadoSocket = EstadoSocket + 4
End If
End If
Final:
End Function
Public Function MensajeEntrante(Socket As Long) As Boolean
'MensajeEntrante por ACHERNAR 7/2007
'para el foro de www.elhacker.net
'
'Esta funcion indica si el socket está en estado
'De Lectura. si lo está retorna True.
'Si no hay datos para leer en el socket retorna False.
MensajeEntrante = False
Select Case EstadoSocket(Socket)
Case Is = 1
MensajeEntrante = True
Case Is = 3
MensajeEntrante = True
Case Is = 5
MensajeEntrante = True
Case Is = 7
MensajeEntrante = True
End Select
End Function
'*****************************************************************
'*****************************************************************
'*****************************************************************
'<el codigo termino justo antes de esta etiqueta>
hay un par de funciones que tienen cosas al pedo pero funcionan igual
como la de conectar y la de ver el estado del socket... le puse un par
de cosas mas para mostrarlas, pero no son necesarias para que funcione






supongo que si
jajaj con que poco soy feliz no? jaja, porque las posibilidades con vb6 + apis son ilimitadas... de hecho todo lo ves en este momento esta funcionando con apis... incluso hay apis... hiperelaboradas como por ejemplo para conectarte a un servidor ftp solo pasandole como parametro el usuario y el pass, aunque tiene quedar claro que agarrarle la mano al winsock tampoco es tan secillo pero tampoco es dificil. Bueno espero tenerlo para mañana... salu2
