Sockets Error 10060

Sockets Error 10060

Postby Vikthor » Wed May 14, 2008 1:33 am

Hola a todos:

Cuando hago hago una conexión a un puerto y este no esta abierto, la aplicación me devuelve el error 10060.

La descripción del error es "Time-out error ".

Hasta ahí todo funciona muy bien.

Lo que no he podido controlar es que mi aplicación no permita ejecutar otra acción hasta que el socket reciba el mensaje del error y autómaticamente se cierre.

Esta es la función que estoy usando :

Code: Select all  Expand view
FUNCTION Client( oWnd )
   LOCAL cIp
   LOCAL cServer
   LOCAL nPort := 2510

   oSocket := TSocket():New( nPort )

   oSocket:bRead := { | oSocket | OnReadClient( oSocket ) }
   oSocket:bConnect := { | oSocket , nErrorCode  | ClientSend( oSocket , nErrorCode ) }
   oSocket:bClose := { || MsgInfo( "El Servidor cerro la sesion" ) , GetApp():oWnd:End() }
   oSocket:Connect( GetApp():cServer , nPort )

   oSocket:Listen()


RETURN( NIL )

FUNCTION ClientSend( oSocket , nError )

   IF nError == 0
      oSocket:SendData( "START "+GetHostName()+ " conectado desde "+ oSocket:cIPAddr+ " a las "+Time())
   ELSE
      MsgStop( "Error conexion..." + Str( nError ) +CRLF )
      GetApp():oWnd:End()
   ENDIF

RETURN( NIL )




EL código funciona, sin embargo el periodo de respuesta es cuando menos 45 segundos y durante ese periodo de tiempo el sistema permite hacer cualquier acción.

Hay alguna manera de que pueda controlar eso ?
Vikthor
User avatar
Vikthor
 
Posts: 271
Joined: Fri Oct 07, 2005 5:20 am
Location: México

Re: Sockets Error 10060

Postby Vikthor » Fri May 16, 2008 12:04 am

:D Alguna pistita

Vikthor wrote:Hola a todos:

Cuando hago hago una conexión a un puerto y este no esta abierto, la aplicación me devuelve el error 10060.

La descripción del error es "Time-out error ".

Hasta ahí todo funciona muy bien.

Lo que no he podido controlar es que mi aplicación no permita ejecutar otra acción hasta que el socket reciba el mensaje del error y autómaticamente se cierre.

Esta es la función que estoy usando :

Code: Select all  Expand view
FUNCTION Client( oWnd )
   LOCAL cIp
   LOCAL cServer
   LOCAL nPort := 2510

   oSocket := TSocket():New( nPort )

   oSocket:bRead := { | oSocket | OnReadClient( oSocket ) }
   oSocket:bConnect := { | oSocket , nErrorCode  | ClientSend( oSocket , nErrorCode ) }
   oSocket:bClose := { || MsgInfo( "El Servidor cerro la sesion" ) , GetApp():oWnd:End() }
   oSocket:Connect( GetApp():cServer , nPort )

   oSocket:Listen()


RETURN( NIL )

FUNCTION ClientSend( oSocket , nError )

   IF nError == 0
      oSocket:SendData( "START "+GetHostName()+ " conectado desde "+ oSocket:cIPAddr+ " a las "+Time())
   ELSE
      MsgStop( "Error conexion..." + Str( nError ) +CRLF )
      GetApp():oWnd:End()
   ENDIF

RETURN( NIL )




EL código funciona, sin embargo el periodo de respuesta es cuando menos 45 segundos y durante ese periodo de tiempo el sistema permite hacer cualquier acción.

Hay alguna manera de que pueda controlar eso ?
Vikthor
User avatar
Vikthor
 
Posts: 271
Joined: Fri Oct 07, 2005 5:20 am
Location: México

Postby Antonio Linares » Fri May 16, 2008 5:01 pm

Vikthor,

Depende de que la conexión sea síncrona ó asíncrona.
Sincrona fuerza a esperar y no deja hacer nada mientras tanto.

La clase TSocket llama a WSAAsyncSelect(). No habría que llamar a esa función para forzar que sea una comunicación síncrona. Habría que probarlo.

Otra opción es deshabilitar la ventana principal con oWnd:Disable() para que el usuario no pueda hacer nada, y habilitarla con oWnd:Enable() cuando se establezca la conexión.
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 41901
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Postby Vikthor » Fri May 16, 2008 5:39 pm

revisando la clase tSocket
Code: Select all  Expand view
   WSAAsyncSelect( ::nSocket, WndMain():hWnd, WM_ASYNCSELECT,;
      nOr( FD_ACCEPT, FD_OOB, FD_READ, FD_CLOSE, FD_CONNECT, FD_WRITE ) )


En FW se usan socket asíncronos. :)

Gracias



Antonio Linares wrote:Vikthor,

Depende de que la conexión sea síncrona ó asíncrona.
Sincrona fuerza a esperar y no deja hacer nada mientras tanto.

La clase TSocket llama a WSAAsyncSelect(). No habría que llamar a esa función para forzar que sea una comunicación síncrona. Habría que probarlo.

Otra opción es deshabilitar la ventana principal con oWnd:Disable() para que el usuario no pueda hacer nada, y habilitarla con oWnd:Enable() cuando se establezca la conexión.
[/code]
Vikthor
User avatar
Vikthor
 
Posts: 271
Joined: Fri Oct 07, 2005 5:20 am
Location: México


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 37 guests