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