Hola antonio
El Cliente envia con Senddata() un archivo xml formateado como una cadena que tiene mas o menos 1600-1800 caracteres.
El servidor me la corta en unos 1400 bytes.
He probado agregar un syswait(.5) a continuacion del AddRequest() y aparentemente soluciona el problema, es como si el cliente estuviera enviando la data en paquetes ( como hace con sendfile() ), pero como se reciben cadenas de distintos clientes simultaneamente he tenido que implementar la TCtrlSocket para ir guardando la data en un array y poder procesarla secuencialmente. Sera que el Tctrl no tiene tiempo de procesar la data y esto lo que ocasiona el problema ?
No se si esto que he hecho sera confiable con una demanda de 15-20 clientes en forma simultanea que es lo que espero recibir en forma habitual.
Aqui tienes parte del codigo a ver si puedes ver algun error
Muchas gracias por la ayuda que puedas brindarme
- Code: Select all Expand view
oSocket:bAccept := { | oSocket | oClient := TSocket():Accept( oSocket:nSocket ),;
cSocket:=cvaltochar(oClient:nSocket) ,;
tCtrl:AddRequest( oClient, {|oClient| OnClose(cSocket)},{|| NIL }),;
LogFile( 'cfrncoms.txt', { 'Cliente Conectado ...' + cvaltochar(oClient:nSocket)} ),;
[color=#FF4000]Syswait(.5)[/color] ,;
tCtrl:ServeClients() }
//.......metodo de la clase TcTrlSocket
METHOD ServeClients() CLASS TCtrlSocket
local nLong
local nServe
local cPart:=""
::lServerWorking := .T. // Serving
::nPendings := Len( ::aRequests )
WHILE Len( ::aRequests ) > 0
for nServe := 1 To Len(::aRequests)
if ::aRequests[ nServe ]:nSocket != 0
cData := ::aRequests [ nServe ]:GetData()
//..aqui tuve que agregar esto para que funcione ?????
[color=#FF4000]syswait(2)[/color]
if( !empty(cData) ,( cRespu := Valida(cData),;
::aRequests[ nServe ]:Senddata(cRespu) ,;
LogFile( 'cfrncoms.txt', { 'Respuesta Enviada...' + ;
cvaltochar(::aRequests[ nServe ]:nSocket)+ ;
' - Nro.Trx: '+cNroRef } ),;
::aRequests[ nServe ]:nSocket := 0 ),NIL)
endif
next
for nServe = 1 To Len( ::aRequests )
if ::aRequests [ nServe ]:nSocket == 0
if ::abEnd [ nServe ] != Nil // bEnd Action
Eval( ::abEnd [ nServe ] ) // End Socket
endif // ------------
aDel( ::aRequests , nServe ) // Delete from...
aSize( ::aRequests , Len( ::aRequests ) - 1 ) // ... list.
::nPendings := Len(::aRequests)
nServe-- // Delete from list
if Len( ::aRequests ) == 0 // list Empty?
exit
endif
endif
next
ENDDO
::lServerWorking:=.F. // Not Serving
DbCloseAll()
Return Nil