ENVIO DE DATOS CON TSOCKET

ENVIO DE DATOS CON TSOCKET

Postby rterraz » Thu Mar 26, 2015 9: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
User avatar
rterraz
 
Posts: 182
Joined: Wed Nov 08, 2006 11:44 pm
Location: Argentina

Re: ENVIO DE DATOS CON TSOCKET

Postby Antonio Linares » Fri Mar 27, 2015 6:10 am

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

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

Re: ENVIO DE DATOS CON TSOCKET

Postby rterraz » 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: 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
 
User avatar
rterraz
 
Posts: 182
Joined: Wed Nov 08, 2006 11:44 pm
Location: Argentina

Re: ENVIO DE DATOS CON TSOCKET

Postby Antonio Linares » Sun Mar 29, 2015 7: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
User avatar
Antonio Linares
Site Admin
 
Posts: 41405
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: ENVIO DE DATOS CON TSOCKET

Postby rterraz » Tue Apr 07, 2015 3:52 pm

anda bien...muchas gracias
User avatar
rterraz
 
Posts: 182
Joined: Wed Nov 08, 2006 11:44 pm
Location: Argentina

Re: ENVIO DE DATOS CON TSOCKET

Postby Antonio Linares » Tue Apr 07, 2015 4:34 pm

Excelente! :-)
regards, saludos

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


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 56 guests