Colaboraciones en el Guille

Enviar archivos por red (VB6)

[Aplicaciones Cliente-Servidor]

Fecha: 07/Feb/2006 (06/02/2006)
Autor: MaLkAvIaN_NeT - jav_025(arroba)hotmail.com

Antes de empezar

Para poder asimilar mejor el tema hay que tener un concepto del desarrollo basado en cliente - servidor, graficando esta teoría en un ejemplo funcional se podría pensar en un troyano, una aplicación que tiene como finalidad tener el control de un ordenador remoto al que no se tiene acceso físicamente, para un usuario espía solo le bastaría con tener la IP de la víctima para poder planear un ataque empezando con buscar la forma de ingeniarse para poder mandarle el troyano. Un troyano consta generalmente de tres partes de las cuales sólo nos interesa el Server y el cliente, el Server es el que se ejecuta en la víctima, este es programado para que una ves ejecutado abra un puerto y lo ponga a la escucha, una ves que esto sucede el atacante desde su PC ejecuta el Cliente el cual se conecta con el Server por el puerto que puso a la escucha.

Es posible crear un troyano en visual Basic programando un Server,
un cliente y un editor, y agregarle las funcionalidades que nuestra imaginación y destreza nos permitan hacer.

Programación con Sockets

Los sockets vienen a ser una librería de programación que permiten  interactuar a las aplicaciones con el protocolo TCP/IP, éstas aplicaciones pueden ser cliente, servidor o programas dentro del mismo ordenador.

En Visual Basic 6.0 tenemos un control llamado 'Microsoft Winsock Control 6.0' el cual internamente hace la manipulación de sockets las cual podemos controlar a través de una serie de propiedades y eventos.

Desventajas del control Winsock en aplicaciones Cliente-Servidor

Si tratamos de distribuir una aplicación cualquiera que haya sido programado con el control winsock a algún ordenador que no tenga instalado el VB generará un error al correr el archivo ejecutable (*.exe), bien esto tiene una explicación; VB está basado en componentes (archivos reutilizables) de los cuales nuestras aplicaciones heredan facultades y que las hace dependientes.

El control winsock depende de un archivo llamado winsock.ocx, si la PC destino no encuentra éste componente simplemente no se ejecutará la aplicación.

Soluciones

Registrar los componentes.- a continuación explicaré una forma de registrar componentes manual:
1.-Inicio / Ejecutar , ó winkey + r
2.-escribir Regsvr32 archivo.dll o regsvr32 archivo.ocx ejemplo: regsvr32 c:\windows\system32\msvbvm60.dll
3.- ahora este componente esta registrado para ser usado.
Para eliminar: regsvr32 /u c:\windows...*.dll

Generar los instaladores.-Si pensaste que generar el instalador era solo una cuestión de estilo como me lo dijeron en un foro, en sí su finalidad principal es registrar y copiar en la PC los componentes que la aplicación consumirá.

Utilizar la API.-La utilización de la API de Windows es una solución a muchos problemas, con esto logramos la interoperabilidad entre la aplicación y el S.O sin depender de componentes.

Creación de aplicaciones Cliente-Servidor

Con la explicación preliminar ya se tiene una mejor noción de lo que se quiere lograr, y por otro lado será mas fácil discernir lo que se viene.

En esta ocasión usaremos el control winsock, posteriormente podré publicar otro artículo con la utilización de la API porque es un tema mas amplio, bien ahora a utilizar el Visual Basic.

Winsock.-Si hemos creado un proyecto Standard este control no estará y tenemos que agregarlo (componentes /agregar/ microsoft winsock control 6.0), si no es así aparecerá por defecto en la barra de herramientas, el winsock(control con dos pc entrelazadas) es un control que no es visible en tiempo de ejecución, algo así como un timer, y tiene unas propiedades y métodos que tenemos que conocer:

Propiedades:

LocalPort.-sirve para asignarle un puerto

Listen.-Sirve para poner a la escucha el puerto asignado

RemoteHost.-Sirve para especificar el equipo remoto asignando la IP

RemotePort.-Es el puerto remoto con el que nos enlazaremos, para que la comunicación entre nuestra aplicación sea implícita hará falta que el cliente y el Server utilicen el mismo puerto.

State.-Información sobre el estado (abierto, cerrado ,a la escucha, etc)

Métodos:

DataArribal.-Este evento se desencadena cuando el control recibe algún dato, dato de tipo long el cual se puede almacenar en una variable. En el ejemplo de a continuación el winsock (ws_server) recibe una cadena, la cual es capturada con la propiedad 'Getdata' y posteriormente almacenada en una variable (mensaje_recibido).

Private Sub ws_server_DataArrival(ByVal 
bytesTotal As Long)

Dim mensaje_recibido As String

ws_server.GetData mensaje_recibido
MsgBox "el mensaje recibido fue " & mensaje_recibido

End Sub

SendData.-Como su nombre lo dice sirve para enviar datos

SendProgress.-Este evento se produce cada vez que se envía un archivo,controlándolo podríamos ver el progreso de envío.

ConnectionRequest.-Esto significa petición de conexión generalmente se programa este evento en el Server, pues siempre es el cliente quien se conecta, cuando se ejecuta se recibe un parámetro de tipo long (requestID) con el que se decide aceptar o no la petición.

Conectando el Cliente con el Server.

A continuación trabajaremos con dos proyectos y lo haremos muy simple; empezaremos con el primero.

Cliente.-Abrimos un nuevo proyecto y lo llamamos Cliente, agregamos un control Winsock (ws_cliente), un textbox (txt_envia), dos commandButton (cmd_enviar,cmd_conectar).

La finalidad de este ejemplo es mostrar la comunicación entre el cliente y el Server, para esto el cliente enviará lo que se escriba en el textbox a otro textbox en server, copiamos el siguiente código:

private sub cmd_conectar_click()
Me.ws_cliente.Connect "192.168.1.34", "8888"
end sub
private sub cmd_emviar_click()
me.ws_cliente.SendData me.txt_envia
end sub

Nota.- Para poder conectarnos tiene que estar corriendo el Server pues es a él a quien nos conectamos y quien nos abre el puerto. A por el Server.

Server.-Nuevo proyecto y lo llamamos Server, agregamos un winsock (ws_server),un textbox (txt_recibe).


Lo que hacemos a continuación es poner a la escucha el puerto 8888, luego si se conecta el cliente aceptamos la conexión, y luego todo lo que llega lo almacenamos en la variable texto_recibido y lo ponemos en el txt_recibido.

 

Private Sub Form_Load()
Me.ws_server.Close
Me.ws_server.LocalPort = "8888"
Me.ws_server.Listen
End Sub
Private Sub ws_server_ConnectionRequest(ByVal requestID As Long)
Me.ws_server.Close
Me.ws_server.Accept requestID
End Sub

Private Sub ws_server_DataArrival(ByVal bytesTotal As Long)
Dim texto_recibido As String
Me.ws_server.GetData texto_recibido
Me.Txtrecibido = texto_recibido
End Sub

Nota..-Las aplicaciones que hicimos anteriormente nos permite enviar una mensaje de PC a PC montadas sobre una red, podemos también correr las dos aplicaciones en la misma PC, poniendo la IP local.


Envío de archivos por la red


En este artículo adjunto las aplicaciones cliente y servidor para enviar archivos por la red con el código está detalladamente comentado, a continuación no volveré a  copiar el código solo explicaré unos puntos que considero necesario ser profundizados.

Estas aplicaciones están basadas en el ejemplo anterior, también se conectan entre sí transmitiéndose datos, solo hemos agregado unas cosas más y hemos hilvanando la manera mas entendible de codificarla.

La aplicación cliente como sabemos se conecta al servidor, una vez conectado podemos elegir una archivo de nuestra PC para enviarla a la PC destino, es necesario conocer la ruta de la PC destino, mencionado proceso se podría hacer mas funcional al interactuar mejor ambas aplicaciones, así el Server elegiría la ruta donde quiere que se guarde la aplicación y la envía al cliente quien recoge y envía el archivo a esa ruta, pero esto sería mas complicado para los que empiezan así que opte por hacerlo simple. Ambas aplicaciones utilizan patrones de envío, es decir que se les asigna señales a cada dato enviado para poder clasificarlos, me explico mejor; quiero enviar un archivo, el archivo tiene un nombre, tamaño y ruta, entonces uniré toda esta información y le agregaré el patrón 'archivo', tendríamos el me.ws_cliente.sendata "archivo" & me.ruta_destino & me.longitud_archivo cuando el Server reciba cada dato los clasifica según el patrón que contenga, por ejemplo el anterior tenía el patrón archivo, entonces guardará los datos del archivo y sabrá que hacer con ellos.

CommondDialog (showopen) Tiene unas propiedades que manejaremos:

Filterr.-Sirve para seleccionar que archivos y con que extensión se mostrarán
en la selección.
FileName.-Me da la ruta exacta del archivo seleccionado (incluyendo nombre y extensión)
FileTitle.-Me da el nombre del archivo

Cuando se selecciona el archivo se abre en código binario:

Open Me.cd_directorio.FileName For Binary As #1

Me.str_contenido_archivo = Input(LOF(1), 1)

Close #1

Luego de almacenar los datos necesarios del archivo como el tamaño, ruta a enviar y el archivo en sí procedemos a enviarlo, cuando el Server lo reciba hará el mismo procedimiento pero no lo leerá si no lo escribirá en la ruta obtenida. Se puede personalizar el envío con un progressBar y el evento sendProgress pero sería más enliado, estoy pensando en trabajar la misma rutina pero usando la API, si es así no dudaré en publicarlo aquí.

Saludos desde Trujillo - Perú 


Fichero con el código de ejemplo: malkavian_Envio_de_archivos_por_red.zip - 6,06 KB

(MD5 checksum: 4CBC3DE5FAAA1597A5D7715559A12A1E)


ir al índice principal del Guille