FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour ENVIO DE DATOS CON TSOCKET
Posts: 182
Joined: Wed Nov 08, 2006 11:44 PM
ENVIO DE DATOS CON TSOCKET
Posted: Thu Mar 26, 2015 09:01 PM

Estoy usando una conexion por medio de sockets (Tsocket de fwh) y necesito saber si el metodo oSocket:SendData(cDat) tiene alguna limitacion en cuanto al largo de la cadena a enviar a un servidor.
Necesito enviar una cadena de unos 3000 bytes y cuando lo hago el servidor recibe una cadena cortada , como se puede hacer para que llegue en su totalidad sin tener que usar SendFile() ?
Muchas gracias por la ayuda que puedan brindarme

Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: ENVIO DE DATOS CON TSOCKET
Posted: Fri Mar 27, 2015 06:10 AM

Que te devuelve la llamada a SendData() ? Debe devolver el tamaño de lo enviado.

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 182
Joined: Wed Nov 08, 2006 11:44 PM
Re: ENVIO DE DATOS CON TSOCKET
Posted: Sun Mar 29, 2015 12:26 AM
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 (fw): Select all Collapse
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
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: ENVIO DE DATOS CON TSOCKET
Posted: Sun Mar 29, 2015 07:32 AM

En principio se ve bien, tendrás que probarlo con esa carga de clientes y ver como se comporta

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 182
Joined: Wed Nov 08, 2006 11:44 PM
Re: ENVIO DE DATOS CON TSOCKET
Posted: Tue Apr 07, 2015 03:52 PM

anda bien...muchas gracias

Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: ENVIO DE DATOS CON TSOCKET
Posted: Tue Apr 07, 2015 04:34 PM

Excelente! :-)

regards, saludos

Antonio Linares
www.fivetechsoft.com

Continue the discussion