Social Icons

viernes, 28 de marzo de 2014

Como programar en red con visual basic 6 - Propiedades del control Winsock

Estimados lectores.

Esta entrada es muy importante, ya que aprenderemos las funciones necesarias para realizar una aplicación en red totalmente validada, funcional y sin problemas de manejo de errores.

En pocas palabras, aprenderemos cómo programar una aplicación en red que no tenga fallas.

Listen

 Pone a la aplicación en espera de una conexión de un cliente, cuando el winsock recibe un intento de conexión, se produce el evento connectionRequest, entonces en este método se debe llamar al evento Accept para aceptar la conexión entrante. Se hace notar que un winsock solo pude aceptar una conexión, o sea sería conexión de computadora a computadora. No es muy común que nosotros querramos hacer aplicaciones en las que nuestro servidor solo atienda a una computadora cliente, sino que atienda a varias. Para hacer que nuestro servidor acepte a varias conexiones a la vez, lo que hacemos es establecer un winsock principal totalmente a la espera, y que éste al recibir una conexión entrante cargue otro winsock y le asigne la nueva conexión, mientras nuestro winsock principal sigue recibiendo más conexiones y asignándolas a nuevos winsocks.

El winsock original debe establecerse su propiedad index = 0  para que este winsock sea el inicial de un vector de winsocks. Cada winsock nuevo que éste cree se irá almacenando en el vector.

Winsock original
(esperando conexiones)
Winsock creado por el original
(atendiendo cliente 1)
Winsock creado por el original
(atendiendo cliente 2)
Espacio libre para winsock


LocalPort

Propiedad que debe establecerse en el servidor para que acepte conexiones de los clientes. Es de lectura y escritura, además está en disponible en tiempo de diseño y ejecución.
Ejemplo: Winsock1.LocalPort

ConnectionRequest

Evento que se activa cuando el servidor detecta que hay un cliente queriendo conectarse a él. Al aceptar la conexión con el método Accept, las propiedades RemoteHostIP guarda la IP del cliente y RemotePort guarda el puerto utilizado por el cliente.

Accept

Esta propiedad es para aceptar la conexión entrante.
Ejemplo: winsock1.accept RequestID

Dataarrival

Es cuando el servidor está recibiendo mensajes del cliente
  
GetData

Recibe el mensaje que activó a DataArrival, y lo guarda en una variable y borra lo que se recibió, ya que se queda almacenado en el buffer del sistema(memoria temporal)
Ejemplo:  dim datos as string
                 Winsock1.GetData datos

SendData

Para mandar mensajes al cliente, que puede ser texto o código binario, en caso de mandar archivos.
Ejemplo: winsock1.SendData “Mensaje”

State

Propiedad del winsock que nos permite saber el estado de la conexión, valores que puede devolver:

Valor               Constante                   Estado

0                      sckClosed                   Cerrado
1                      sckOpen                     Abierto
2                      sckListening               Escuchando
3                      sckConnectionPending          Conexión pendiente
4                      sckResolvingHost      Resolviendo Host
5                      sckHostResolved       Host resuelto 
6                      sckConnecting                       Conectando
7                      sckConnected             Conectado
8                      sckClosing                  Cerrando la conexión

9                      sckError                      Ha detectado un error

Close

Propiedad del winsock que permite cerrar el control winsock para establecer una nueva conexión, esto siempre se debe de hacer antes de invocar la propiedad connect.
Ejemplo: winsock1.close

Connect

Propiedad del winsock que permite establecer una conexión con otro programa, en la misma computadora, en la red, o en internet.
Ejemplo: winsock1.connect “148.208.196.5”, 10112

BytesReceived

Propiedad de solo lectura que almacena la cantidad de datos recibidos. Está disponible sólo en tiempo de ejecución.
Ejemplo: winsock1.BytesReceived

PeekData

Este método es similar a GetData, lo único que varía, es que el GetData elimina los datos recibidos del buffer, y el PeekData no los elimina.

SendProgress

Este método se produce mientras se están enviando datos. Pasa como parámetros los bytes enviados desde la última vez que se activó el evento (bytesEnv) y los bytes que esperan a ser enviados en el buffer de transmisión (bytesRest)

Ejemplo: winsock1_SendProgress (bytesEnv As Long, bytesRest As Long)

SendComplete

Se produce cuando en una operación de envío de datos, se han enviado todos.

Ejemplo: winsock1_SendComplete()

Error

Se produce siempre que ocurre un error en los procesos de segundo plano (por ejemplo, un fallo al conectar o un fallo al enviar o recibir en segundo plano). Pasa como parámetros el código de error, la descripción del error, el scode del error, el origen del error,  y un booleano para cancelar o aceptar el que presente un cuadro de dialogo con el aviso de error.

Winsock1_Error(número As Integer, descripción As String, scode As Long, origen As String, archivoAyuda as String, contextoAyuda As Long, cancelarVista As Boolean)


El código de error puede tomar estos valores:

Constante                                           Valor   Descripción

SckOutOfMemory                             7          Sin memoria
SckInvalidPropertyValue                  380      El valor de la propiedad no es válido
SckGetNotSupported                                    394      No se puede leer la propiedad
SckSetNotSupported                         383      La propiedad es de sólo lectura.
SckBadState                                      40006  Protocolo o estado de conexión incorrecto para
La solicitud o la transacción
requerida.
SckInvalidArg                                               40014  El argumento que se pasó a una función no
estaba en el formato correcto o en el intervalo
especificado.
SckSuccess                                        40017  Correcto
SckUnsupported                                40018  Tipo Variant no aceptado.
SckInvalidOp                                    40020  La operación no es válida en el estado actual.
SckOutOfRange                                40021  El argumento está fuera del intervalo.
SckWrongProtocol                            40026  Protocolo erróneo para la solicitud o la
transacción requerida.
SckOpCanceled                                 10004  Se canceló la operación.
SckInvalidArgument                         10014  La dirección solicitada es una dirección de
multidifusión, pero el indicador no está
activado.
SckWouldBlock                                            10035  El socket es no bloqueante y la
operación especificada se bloqueará.
SckInProgress                                    10036  Se está efectuando una operación de Winsock
bloqueante.
SckAlreadyComplete                        10037  Se completó la operación. No se están
efectuando operaciones bloqueantes.
SckNotSocket                                               10038  El descriptor no es un socket.
SckMsgTooBig                                              10040  El datagrama es demasiado grande para
el búfer y se truncará.
SckPortNotSupported                                   10043  El puerto especificado no es compatible.
SckAddressInUse                              10048  Dirección en uso.
SckAddressNotAvailable                  10049  La dirección no está disponible en la máquina
local.
SckNetworkSubsystemFailed                       10050  Error en el subsistema de red.
SckNetworkUnreachable                   10051  El host no puede encontrar la red en este
momento.
SckNetReset                                      10052  Expiró el tiempo de espera de la conexión antes
de establecer SO_KEEPALIVE.
SckConnectAborted                          10053  La conexión se ha cancelado al sobrepasar el
tiempo de espera o por otro error.
SckConnectionReset                         10054  La conexión se ha restablecido desde el lado
remoto.
SckNoBufferSpace                            10055  No hay espacio disponible en el búfer.
SckAlreadyConnected                      10056  El socket ya está conectado.
SckNotConnected                             10057  El socket no está conectado.
SckSocketShutdown                         10058  El socket se ha desactivado.
SckTimedout                                     10060  Se ha sobrepasado el tiempo de conexión.
SckConnectionRefused                     10061  Se ha forzado el rechazo de la conexión.
SckNotInitialized                              10093  Es necesario llamar primero a WinsockInit.
SckHostNotFound                            11001  Respuesta autorizada: host no encontrado.
SckHostNotFoundTryAgain             11002  Respuesta no autorizada: host no encontrado.
SckNonRecoverableError                  11003  Errores no recuperables.
SckNoData                                        11004  Nombre válido; no hay registro de datos del
tipo solicitado.

No hay comentarios.:

Publicar un comentario

 
Blogger Templates