Winsock en Visual Basic 6 (parte 2)

Hola a todos, pues como ya les venia diciendo, ésta es la segunda parte del tutorial de Winsock en VB6. Supongo que en otros lenguajes será muy parecido. Espero lo disfruten.

Recordatorio

En la parte anterior vimos algunas cuestiones técnicas acerca de como se comunican las computadoras en la red, que es una IP y esas cosas. Si no conoces mucho de eso te sugiero que veas este link.

El control Winsock

Para hacer nuestra pequeña aplicación cliente-servidor vamos a usar un control llamado Winsock. Para insertarlo en el formulario tendremos que ir al menú Proyectoy elegir Componentes.

En el cuadro de dialogo que aparece buscamos “Microsoft Winsock Control” y marcamos la casilla. (ver figura)

Al hacer clic en “Aceptar” veremos como en la caja de herramientas aparecen 2 computadoras unidas mediante una linea (observar parte izquierda de la figura anterior).

Lo que sigue ahora es añadirlo al formulario tal como se hace con cualquier control. Cuando ejecutemos el programa vamos a notar que no aparece el Winsock a la vista, esto es completamente normal, ya que en tiempo de ejecución Winsock es invisible al usuario.

El nombre predeterminado que pone VB al control es “Winsock1” pero como ya sabeis, se puede cambiar.

Propiedades y métodos.

A estas alturas quiero suponer que ya sabes que es una propiedad y un método. Vamos a examinar algunos de los mas importantes:

LocalPort: (Propiedad, lectura/escritura) Establece el puerto local que va a usar el control para el envío/recepción de información.

RemotePort: (Propiedad, lectura/escritura) Establece el puerto remoto que va a ser usado para el envío/recepción de información.

RemoteHost: (Propiedad, lectura/escritura) Establece el nombre de host o dirección IP del equipo al que nos vamos a conectar.

NOTA: La configuración de estas propiedades debe de ser simetrica en nuestra aplicación cliente y en la aplicación servidor, de lo contrario no funcionará. Para entender el concepto de “simetrico” observa el siguiente ejemplo:

Protocol: (Propiedad, lectura/escritura) Establece el protocolo usado por el control Winsock, este puede ser sckTCPProtocol para trabajar con TCP o sckUDPProtocol para trabajar con UDP. Debe de ser el mismo en el cliente y el servidor.

LocalIP: (Propiedad, solo lectura) Devuelve la IP de la máquina local.

LocalHostname: (Propiedad, solo lectura) Como el anterior, pero devuelve el nombre del equipo.

Listen: (Método, solo para TCP) Pone el puerto indicado en la propiedad LocalPort en espera de una conexión, se dice que “lo pone a la escucha”.

Bind: (Método, solo para UDP) Es el equivalente a Listen de TCP.

Connect: (Método) Envía una solicitud de conexión al equipo remoto.

Accept: (Método) Acepta una solicitud de conexión enviada por un equipo remoto usando Connect.

SendData: (Método) Envía datos al equipo remoto.

GetData: (Método) Recibe los datos enviados por el equipo remoto.

Close: (Método) Finaliza la conexión.

Caso práctico

Dicho lo anterior, vamos a empezar el desarrollo de nuestra aplicacion: un mini-chat 1 a 1 para redes locales, este proyecto lo queria implementar en la empresa cuando prohibieron el Messenger, pero autorizaron Skype y pude hacer otras travesuras con su API, asi que ya no hice(Vease Skype Bomber).

Para comunicarse cliente y servidor usarán los puertos 1501 y 1500 respectivamente, con el protocolo TCP.

Configuracion basica del servidor:

Hacemos un formulario como el siguiente:

Primera versión del formulario servidorComo podeis observar puse el nombre de cada control en su “Caption”; el Winsock se quedo con el nombre de Winsock1. Al formulario podeis llamarlo como quieras, yo lo he llamado frmChatServer.

Procedemos a preparar el programa añadiendo el sigueinte código:

Private Sub Form_Load()
'// Configuramos Winsock1
Winsock1.Protocol = sckTCPProtocol
Winsock1.LocalPort = 1500
Winsock1.RemotePort = 1501
'// Ponemos puerto a la escucha
Winsock1.Listen
txtEstadoSocket.Text = "Esperando conexión"
'// Borramos los textos
txtConversaciones.Text = ""
txtMensaje.Text = ""
txtMiNombre.Text = Winsock1.LocalHostName
txtIPCliente.Text = "0.0.0.0"
cmdEnviar.Caption = "Enviar"
cmdAtencion.Caption = "Toque de atención"
cmdDesconectar.Caption = "Salir"
End Sub

Al ejecutarlo podremos apreciar como el puerto ya está a la escucha (esperando una conexión). ¿Cómo? Muy sencillo, con el comando netstat -a de la consola de Windows.

El formulario funcionandoLo que sigue es empezr a trabajar en el cliente, pero eso….. será en la tercera entrega……

Anuncios

15 comentarios en “Winsock en Visual Basic 6 (parte 2)

  1. Alberto dijo:

    Buenas Tardes Amigo. Tu tuto esta quedando muy bien. La verdad ya yo logre hacer el servidor, pero cuando intento conectarme desde fuera de la red no se conecta!!! Yo tengo un modem y un router (conectado al modem), mi pregunta es: tengo q direccionar los puertos tanto en el modem como en el router?? o el modem lo hace solo??

    Gracias…

    • underdog1987 dijo:

      Hola, sé que me he demorado demasiado con la tercera entrega, espero poder hacerla pronto. en cuanto a lo que preguntas, no entiendo bien como tienes la configuración de red. Supongo que lo que quieres hacer es poder usar la aplicación estando en tu oficina (lugarA), para poder conversar con alguien que está en tu casa (lugar B), -por decirte algunos lugares-.
      Hay 2 opciones: usar una VPN o hacer un port forwarding (redirección de puertos), en ambos casos necesitas acceso a la configuración del router u otro hardware con el que salgan a Internet, y en ambos casos, requieres de configurar los 2 extremos de la “red”. El más fácil es el redireccionamiento de puertos.

      Voy a asumir que estás llamando “módem” al dispositivo que te da tu ISP (p.e. Telmex) y detrás de este tienes un Router (linksys, cisco o el que sea).

      Yo usaría la siguiente configuración (de hecho es la que usa mi control de iluminación, que cuando acabe el HW, lo publicaré también).
      Lugar “A”
      Internet->Modem de ISP configurado en “modo puente”->Router con direccionamiento de puerto 1500->Switch (opcional)->PC donde está la aplicacion.

      Lugar “B”
      Internet->Modem de ISP configurado en “modo puente”->Router con direccionamiento de puerto 1501->Switch (opcional)->PC donde está la aplicacion.

      Si tu ISP te da una IP que está detrás de otro dispositivo (sabes ello por la dirección IP, son del tipo 10.x.x.x o 192.x.x.x) tendrás que hablar con el proveedor de servicios para que te facilite una IP pública

      Espero haberte ayudado, cualquier cosa, me lo dices en los comentarios.

  2. Alberto dijo:

    Gracias por tu ayuda!! la verdad por lo q veo tengo dos problemitas!!

    1. Que tengo configurados en el programa los mismos puertos en ambas Pc´c (servidor y Cliente)

    2. Que no se si el modem esta en “modo puente”, a q te refieres con ese modo??

    Ademas mi IP Publica cambia al encender el modem, en ocasiones es comienza con 1xx. como puede ser 2xx.

    Ahora pregunto:

    1. Al configuar mi router con IP Fija, esa sera la IP q siempre vera el Publico??

    2. Ahi alguna manera de saber cuales IP (Clientes) estan queriendo conectarse al Servidor y que el servidor pueda elegir a cual conectarse??

    Mi Modem es: Huawei MT882 ABA CANTV (venezuela)
    Y el Router es: Linksys WRT54G2 v1.5

    Mi email es: albermillan69@hotmail.com

    Seguire esperando tu gran ayuda!!! 😀

    • Alberto dijo:

      Hola underdog, soy yo de nuevo 😀

      Te cuento:

      Mi modem esta configurado como de fabrica, solo q ahora lo cambie a PURE BRIDGE,
      cuando me conecto al modem->PC sin usar el router mi IP publica es una y cuando me conecto Modem->Router->PC me da otra IP Publica. Esto es normal??

      Ya desactive el cortafuego del modem (mediante la pag web de la operadora ‘CANTV’)
      Ahora:
      Debo abrir los puertos 1500 y 1501 en el modem??
      Debo abrir los puertos 1500 y 1501 en el router??

      ya q cuando hago un escaneo de puertos de mi IP Publica (conectado solo con el modem) me dice q todos estan cerrados, lo hago mediante esta web: https://www.grc.com/x/ne.dll?rh1dkyd2

      Dime q pasos debo seguir para poder accesar a la compu desde internet, ya q me es urgente para probar el CHAT y otros proyectos!!!

      Gracias!!! ya te di me msn…. Estare esperando tu satisfactoria respuesta y espero no molestarte tanto!!! 😀

  3. Alberto dijo:

    Buenas tardes amigo, oye una duda, hice tu programa utilizando el bind porque quiero recibir UDP pero al recibir datos me lo imprime en el txt pero saca puros simbolos, lo estoy usando para recibir datos por medio de udp de un localizador satelital que transmite por gprs,esto es lo que recibo (19/10/2011 01:24:17 p.m.Cliente –> úøèÊš;)

    Como lo soluciono?
    Gracias por tu ayuda

    • underdog1987 dijo:

      Necesitaría conocer el dispositivo que usas, su modelo y todo, para ver si tiene un SDK o algo que nos ayude a ver como transmite el la información, quizá los símbolos es algo que se tenga que descifrar o simplemente no es leible mas que por otro dispositivo similar. Pueden ser muchas cosas.

  4. Muy buen tutorial, si asi nos enseñaran o por lo menos nos proporsionaran los docentes de la carrera que lindo seria. Felicidades y sigue con el mismo estilo de explicacion. Es la primera vez que comento un blog en un foro porque hay que saber reconocer lo bueno y eres bueno haciendo esto, esperamos la tercra parte y algun otro tutorial de sockets pero en java si se pudiera. Atte. Ariel Escobar

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s