SOCKETS

SOCKETS

Postby miarcod » Thu Oct 10, 2019 6:14 pm

Hola estoy haciendo unas pruebas para poner conectar una aplicación mediante el uso de sockets y me encuentro que cuando creo el socket en el cliente e intento realizar la conexión con el servidor pero el servidor no está iniciado
el sistema se queda colgado. y aunque se cierra la ventana del programa este sigue corriendo en memoria y tengo que cerrar el proceso desde el administrador de tareas
Sin embargo si el servidor esta ejecutandose todo funciona correctamente.

¿Como puedo verificar que el servidor se encuentra escuchando las peticiones en la ip y el puerto seleccionado?

En equipo corro un pequeño ejemplo para que actue como servidor
Code: Select all  Expand view  RUN

#include "FiveWin.Ch"

STATIC oWnd, oSocket, oClient, oSay, cLog

//------------------------------------------------------------------------//
Function main(cModo)
   ModoServidor()
RETURN NIL

#DEFINE PUERTO      2019

#define ST_COMMAND  1
#define ST_SENDFILE 2
#define FILE_BLOCK 8000

//------------------------------------------------------------------------//
FUNCTION GetIpMaquina()
Local cIp

If WSAStartup() != 0
   MsgAlert( "WSAStartup error" )
endif
cIp :=  GetHostByName( GetHostName() )
WSACleanUp()
return cIp

//------------------------------------------------------------------------//
FUNCTION ModoServidor()
Local cTitle, oBtn

cLog := ""

DEFINE WINDOW oWnd TITLE cTitle

cTitle := "Servidor de Sockets "
cTitle += GetIPMaquina()
cTitle += ":" + NTRIM(PUERTO)

DEFINE WINDOW oWnd TITLE cTitle FROM 0, 0 TO 24, 80
@ 1,1 SAY oSay PROMPT cLog Size  600,300 BORDER
//@ 0,0 BUTTON oBtn PROMPT "pulsar" ACTION oSay:SetText("Hola")//Pulsado(oSay)

ACTIVATE WINDOW oWnd;
          ON INIT Iniciar() ;
          VALID Cerrar()

RETURN NIL
//------------------------------------------------------------------------//
STATIC FUNCTION Iniciar()
oWnd:Move(50,50)
Server()
RETURN .F.

//------------------------------------------------------------------------//
STATIC FUNCTION Cerrar()
oSocket:End()
sayLog("Cerrando servidor")
RETURN .T.

//------------------------------------------------------------------------//
STATIC FUNCTION SayLog(cValue)
cLog += cValue + CRLF
//Depura(cLog)
//Depura(oSay)
oSay:SetText(cLog)
RETURN NIL


//------------------------------------------------------------------------//
STATIC function Server()

   oSocket = TSocket():New( PUERTO )

   oSocket:bAccept = { | oSocket | oClient := TSocket():Accept( oSocket:nSocket ),;
                       oClient:Cargo := ST_COMMAND,;
                       oClient:bRead := { | oSocket | OnRead( oSocket ) },;
                       oClient:bClose := { | oSocket | OnClose( oSocket ) } }

   oSocket:Listen()
   SayLog("Servidor iniciado")
   SayLog("Esperando peticiones")

return nil


//------------------------------------------------------------------------//
STATIC function OnRead( oSocket )

   local cData := oSocket:GetData()
   local cToken, cRespuesta

   SayLog("Datos recibidos: " +  cData)

   If cData == "GET_SRV"
      SayLog("Solicitud de conexión recibida")
      oSocket:SendData(cData +  "_OK")
      RETURN NIL
   EndIf

   SayLog("Petición desconocida: " +  cData)

return nil

//------------------------------------------------------------------------//
STATIC function OnClose( oSocket )

   sayLog("El cliente ha cerado el socket")
   //MsgInfo( "Client has closed!" )
   oSocket:End()
return nil

 


Para realizar la conexión hago lo siguiente:

Code: Select all  Expand view  RUN

...

STATIC FUNCTION Crearconexion()
   Local nRet

   SayLog("Creando socket contra la IP " + cIpSrv )

   oSocket = TSocket():New( nPuerto )
   oSocket:bRead    = { | oSocket | ProcesaRespuesta( oSocket ) }

   // Never use a MsgInfo() here because it hangs Windows!!!
   oSocket:bConnect = { || Depura( "Conectado") }
   oSocket:bClose   = { || SrvClose() }
   nRet := oSocket:Connect( cIpSrv ) // use the server IP address here
   Depura(nRet, "NRet")
   Depura(oSocket:nRetCode, "osocket:nRetcode")
   //ComprobarConexion()
   SayLog("Fin creando socket contra IP")

RETURN .F.


//------------------------------------------------------------------------//
STATIC FUNCTION Cerrar()
   SayLog("oSocket:Close()")
   If lConectado
      oSocket:Close()
      oSocket:End()
   Else
      SayLog("No estamos conectados")
   EndIf
   SayLog("socket cerrado. Esperndo 1 segundo")
   syswait(1)
RETURN .T.



STATIC FUNCTION ProcesaRespuesta( cRespuesta)
// Comprobando conexión
If oSocket:Cargo = "GET_SRV"
   If cRespuesta == oSocket:Cargo + "_OK"
      lConectado := .T.
      RETURN .T.
   EndIf
EndIf

RETURN NIL

 
miarcod
 
Posts: 199
Joined: Tue Oct 11, 2005 2:17 pm

Re: SOCKETS

Postby Antonio Linares » Fri Oct 11, 2019 4:24 am

Revisa los ejemplos sockserv.prg y sockcli.prg en FWH\samples
regards, saludos

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

Re: SOCKETS

Postby miarcod » Fri Oct 11, 2019 6:04 am

Antonio, gracias por responder

He intentado ejecutar este ejemplo pero se produce un error de ejecución



Code: Select all  Expand view  RUN
 Time from start: 0 hours 0 mins 1 secs
   Error occurred at: 10/11/19, 08:00:59
   Error description: Error BASE/1004  No exported method: SENDDATA
   Args:
     [   1] = U  
     [   2] = C   Hello from server!

Stack Calls
===========
   Called from:  => SENDDATA( 0 )
   Called from: sockserv.prg => (b)MAIN( 23 )
   Called from: .\source\classes\BTNBMP.PRG => TBTNBMP:CLICK( 471 )
   Called from: .\source\classes\BTNBMP.PRG => TBTNBMP:LBUTTONUP( 662 )
   Called from: .\source\classes\CONTROL.PRG => TCONTROL:HANDLEEVENT( 1723 )
   Called from: .\source\classes\BTNBMP.PRG => TBTNBMP:HANDLEEVENT( 1465 )
   Called from: .\source\classes\WINDOW.PRG => _FWH( 3234 )
   Called from:  => WINRUN( 0 )
   Called from: .\source\classes\WINDOW.PRG => TWINDOW:ACTIVATE( 1003 )
   Called from: sockserv.prg => MAIN( 25 )


Ejecuto el programa, pulso en botón escuchar y al pulsar el botón para hablar con el cliente se produce este error
miarcod
 
Posts: 199
Joined: Tue Oct 11, 2005 2:17 pm

Re: SOCKETS

Postby Antonio Linares » Fri Oct 11, 2019 10:40 am

Que versión de FWH estás usando ?
regards, saludos

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

Re: SOCKETS

Postby miarcod » Fri Oct 11, 2019 11:31 am

Fivewin Harbour 13.06
miarcod
 
Posts: 199
Joined: Tue Oct 11, 2005 2:17 pm

Re: SOCKETS

Postby Verhoven » Fri Oct 11, 2019 5:13 pm

En el método SendData( cData ) de la clase solucioné el problema con la siguiente modificación.

En la clase TSocket me ha dado un fallo que dejaba colgado el programa metido en un bucle infinito.
Esto ocurría al enviar datos cuando se perdía la conexión durante el proceso la conexión de red o el ordenador que hace de servidor estaba desconectado, lo que viene a ser lo mismo.

El posible error está en el método SenData, en concreto en la siguiente sección de código:

Code: Select all  Expand view  RUN
if WSAGetLastError() != WSAEWOULDBLOCK
                // exit
             endif


Conviene descomentar la línea donde dice "//exit", o bien hacer una gestión del error en esa parte, si no se descomenta se puede quedar en un bucle sin fin, que es lo que te podría estar sucediendo.
Verhoven
 
Posts: 522
Joined: Sun Oct 09, 2005 7:23 pm

Re: SOCKETS

Postby miarcod » Sat Oct 12, 2019 7:31 am

Gracias voy a probar
miarcod
 
Posts: 199
Joined: Tue Oct 11, 2005 2:17 pm

Re: SOCKETS

Postby thefull » Sun Oct 13, 2019 5:36 pm

Mi consejo es que si vas hacer un servidor y un cliente, olvides el tema de los sockets, y montate un servidor resfull, tu vida te lo agracederá :lol:
Saludos
Rafa Carmona ( rafa.thefullARROBAgmail.com___quitalineas__)
User avatar
thefull
 
Posts: 731
Joined: Fri Oct 07, 2005 7:42 am
Location: Barcelona

Re: SOCKETS

Postby miarcod » Mon Oct 21, 2019 6:36 pm

No se a que te refieres,
Podrías darme más información.

De momento he conseguido la comunicación contra un dispositivo ANDROID y el programa funciona correctamente. Pero el cliente ya está pensando en nuevas funcionalidades y a lo mejor me interesaría otra solución.
Un saludo.
miarcod
 
Posts: 199
Joined: Tue Oct 11, 2005 2:17 pm

Re: SOCKETS

Postby cnavarro » Mon Oct 21, 2019 6:48 pm

Cristobal Navarro
Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo
El secreto de la felicidad no está en hacer lo que te gusta, sino en que te guste lo que haces
User avatar
cnavarro
 
Posts: 6549
Joined: Wed Feb 15, 2012 8:25 pm
Location: España

Re: SOCKETS

Postby miarcod » Mon Oct 21, 2019 7:04 pm

Gracias voy a ver los videos
Un saludo
miarcod
 
Posts: 199
Joined: Tue Oct 11, 2005 2:17 pm


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: Google [Bot] and 44 guests