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