FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Clase TSocket. Una posible mejora.
Posts: 731
Joined: Fri Oct 07, 2005 07:42 AM
Clase TSocket. Una posible mejora.
Posted: Wed Feb 20, 2008 10:08 PM
Esta clase, a mi modo de ver, se puede mejorar en el lado cliente.

Supongamos el caso en que establecemos una conexion del lado del cliente,
      oSockClient := TSocket():New( 2000 )
      oSocketClient:bConnect = { || MyConnect() }
      oSocketClient:bRead    = { | oSocket | OnRead( oSocket ) }
      oSocketClient:bClose   = { || MsgInfo( "disconnected!" ) }
      oSocketClient:Connect( "localhost" ) 

STATIC FUNCTION MyConnect()
 oMemo:Append( "CONECTADO" )
RETURN NIL


Bueno, si eso es ejecutado, al cabo del rato, salta el evento ONCONNECT, pero , si no tenemos escuchando ningun servidor en la ip correspondiente.

驴 Y que nos dice esto ? Que estamos conectado, lo cual no es cierto, pues SI NO EXISTE SERVIDOR, no podemos conectar, pero a煤n y asi, nos indica que estamos conectados, entonces, 驴 que esta mal ?

Bueno, realmente, seg煤n el api de windows, con los sockets asincr贸nicos, que son los que nos brinda Fivewin, el funcionamiento es correcto, es decir, el control pasa por el evento ONCONNECT en la clase TSocket, o a trav茅s del codeblock a nuestro disposici贸n, bConnect.
El problema radica es que se produzca esto NO SIGNIFICA QUE ESTEMOS CONECTADOS!, para ello, necesitamos consultar el numero de error, que nos brinda ;
METHOD HandleEvent( nSocket, nOperation, nErrorCode ) CLASS TSocket


Ese nErrorCode TIENE que ser enviado al codeblock de evaluaci贸n, para poder de esta manera, el disponer de que es lo que ha pasado exactamente, porque la funcion WsaGetLastError(), no garantiza en este caso, que sea el error correcto que te informe.

Asi, se deber铆a de modificar la clase TSocket en estos puntos:

Se recibe el nErrorCode y se envia al codeblock
METHOD  OnConnect( nErrorCode ) INLINE If( ::bConnect != nil, Eval( ::bConnect, Self, nErrorCode ),)


2.- En el method HandleEvent(), observamos como pasamos nErrocode.

         case nOperation == FD_CONNECT
              if ::lDebug .and. ! Empty( ::cLogFile )
                 LogFile( ::cLogFile, { "Connect",;
                          "Socket handle:" + Str( nSocket ) } )
              endif
              oSocket:OnConnect( nErrorCode ) // Aqui.....


Con esto retoques a la clase, ya podemos determinar en nuestro c贸digo que es lo que puede estar fallando en la conexion, quedando asi;

      oSocketClient:bConnect = { |o,nErrorCode| MyConnect( nErrorCode ) }

STATIC FUNCTION MyConnect( nErrorCode )
   if nErrorCode == 0
      oMemo:Append( Time()+ "-->Cliente iniciado en [ " +cIp + ":"+str( nPort, 5 ) + " ]" + CRLF )
   else
      oMemo:Append( "Error conexion..." + Str( nErrorCode ) +CRLF )
   endif

RETURN NIL


Ahora SI QUE PODEMOS DETERMINAR si estamos o no correctamente conectado.

Antonio, 驴 crees que es posible meter esta mejora ? Tambi茅n se podria hacer lo mismo para los otros eventos, he explicado este pues es con el que he tenido que pelearme esta tarde.

Ademas, me he percatado de una cosa muy curiosa, ::nTimeOut,
驴 donde se hace uso de esto , y realmente se usa ?
Mirar茅 ma帽ana m谩s sobre esto.
Saludos

Rafa Carmona ( rafa.thefullARROBAgmail.com___quitalineas__)
Posts: 298
Joined: Fri Oct 07, 2005 05:20 AM
Re: Clase TSocket. Una posible mejora.
Posted: Fri May 16, 2008 05:43 PM

Rafa :

Y mientras el cliente espera la respuesta del server c贸mo avisas al usuario lo que esta pasando ?

En dado caso de que un cliente se trate de conectar a la nada, la respuesta no es inmediata.

Y la aplicaci贸n no se queda "congelada" sino que sigue operando.

Vikthor
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Clase TSocket. Una posible mejora.
Posted: Fri May 16, 2008 06:30 PM

Vikthor,

Tienes que establecer un "timeout" (tiempo limite de espera) para que la aplicaci贸n no espere eternamente. Te refieres a eso ?

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 298
Joined: Fri Oct 07, 2005 05:20 AM
Clase TSocket. Una posible mejora.
Posted: Fri May 16, 2008 09:04 PM
no , a lo que me refiero es lo que puedo hacer miestras espero la respuesta, por que en el tiempo que se recibe la respuesta el sistema no se queda en pausa, y lo que yo pretendo es mostrar un mensaje tipo msgrun() cuando se esta esperando la respuesta.

Antonio Linares wrote:Vikthor,

Tienes que establecer un "timeout" (tiempo limite de espera) para que la aplicaci贸n no espere eternamente. Te refieres a eso ?
Vikthor
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Clase TSocket. Una posible mejora.
Posted: Sat May 17, 2008 08:40 AM

Vikthor,

Si la conexi贸n es as铆ncrona entonces podr铆as usar un MsgRun() sin problemas hasta que necibas el evento de notificaci贸n de conexi贸n.

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 731
Joined: Fri Oct 07, 2005 07:42 AM
Clase TSocket. Una posible mejora.
Posted: Sun May 18, 2008 11:18 AM

Victor , como dice Antonio, como lo que estamos usando son sockets asincronicos, y como bien dices, la aplicaci贸n no se para...
Pues entonces puedes hacer lo que quieras, ;-) , mostrar un dialogo no wait por ejemplo, y cuando salte el evento del OnConnect(), pues matar ese dialogo, etc... , la imaginaci贸n al poder ;-)

Saludos

Rafa Carmona ( rafa.thefullARROBAgmail.com___quitalineas__)

Continue the discussion