Jump to content
Fivewin Brasil

Conexão Socket


wanderlei Cardoso

Recommended Posts

Olá Pessoal, estou precisando criar um servidor socket para conexão de duas ou mais lojas para envio e recebimento de 

solicitações, eu estou usando a classe do TSocket e os exemplos do sockserv e client está funcionando parcialmente mas se o servidor não estiver rodando o client fica travado.

como posso resolver isso?

Link to comment
Share on other sites

Olá Wanderlei.

 

Cara, vc tem que aguardar um tempo e analisar.

 

Vou postar parte de um programa meu que faz comunicação com o Banco do Brasil e dai vc estuda e veja se te atende.

 

 

 
////////////////////////////DADOS DA FUNCAO////////////////////////////////////////////
// NOME       : ComunicaGcb                                                          //
// FINALIDADE : Comunicar com o Correspondente bancário                              //
// PARAMETROS : cMensEnv       -- Mensagem a Enviar                                  //
//              cMensRec       -- Mensagem a Receber                                 //
//              cTipoOperacao  -- Tipo de Operação (P, I, C)                         // 
//              cTipoDoc       -- 1 = Título  2 = Convenio                           // 
//                                                                                   //
///////////////////////////////////////////////////////////////////////////////////////
Static function ComunicaGcb( cMensEnv, cMensRec, cTipoOperacao, cTipoDoc )
 
local i
local lRetorno := .t.
 
cMensRec := space(1200)
 
// Tentando abrir o canal de comunicação
for i = 1 to 3
    
   if oSocket = NIL .or. valtype( oSocket ) = 'U'
      if i > 1
         syswait(.5)
      endif
      oSocket := OpenSocket( )
   endif
next
 
if oSocket <> NIL 
 
    // Enviando
    if envio( cMensEnv )
      // Recebendo resposta
      if cTipoOperacao <> 'CC'
         syswait(.5)
         lRetorno := receber( @cMensRec, cTipoOperacao, cTipoDoc)
     endif
    else
      lRetorno := .f.
    endif
    sysrefresh()
// InetClose( oSocket )
else
   lRetorno := .f.
endif
 
// InetCleanUp()
sysrefresh()
 
return lRetorno
 
/////////////////////////////
Static Function OpenSocket()
 
local lSocket := .f.
local nVezes  := 0
 
// Abrir Socket
do while !lSocket .and. nVezes <= 3
 
        InetInit() 
        oSocket := InetConnectIP( cIPCOBAN, val(cPortaCOBAN) )
        sysrefresh()
        
        if InetErrorCode(oSocket) <> 0 // Aconteceu algum erro
                InetDestroy( oSocket )
                oSocket := NIL
                nVezes ++
                lSocket := .f.
        else
                lSocket := .t.
                exit               
        endif
        sysrefresh()
enddo
sysrefresh()
return oSocket
 
/////////////////////////////////////////
Static Function envio( cMensEnv )
 
local lEnvio      := .f.
local nVezes      := 1
local nLenMensEnv := 0
 
do while !lEnvio .and. nVezes < 10
        nVezes ++
        nLenMensEnv := InetSendAll(oSocket, cMensEnv)
        if nLenMensEnv = len(cMensEnv) .and. nLenMensEnv <> 0 //envio ok
                lEnvio := .t.                        
                exit
        endif
 
        // Tentando abrir nova conexão Socket
        InetClose(oSocket)
        InetCleanUp()
        syswait(.5)
        sysrefresh()
        oSocket := NIL
        oSocket := openSocket()
        SysRefresh()
        //
enddo
Sysrefresh()        
return lEnvio
 
/////////////////////////////////////////////////////////////////////
Static Function receber( cMensRec, cTipoOperacao, cTipoDoc)
 
 
local cAutChave, cHeader := space(101)
local lReceber    := .f.
local lRetorno    := .t.
local nLenMensRec := 0
local nDadosLido  := 0
local nTentativas := 1
 
// Tentando receber 3 vezes
do while !lReceber .and. nTentativas <= 3
 
        nDadosLido := InetDataReady( oSocket, 10000)                  
        sysrefresh()
 
          nTentativas ++
        if nDadosLido <> 1
             loop
        endif
        
          syswait(.5)
        cHeader     := space(101)
 
        // Se retornar 1 é que obteve sucesso na comunicação com o GCB
        if nDadosLido = 1 
                // Receber os Dados do HEADER
                InetRecvALL ( oSocket, @cHeader,101)
                sysrefresh()
 
              
                // Consulta de Pendencias
                if cTipoOperacao == 'XP' .and. len(cHeader) = 101
                   nLenMensRec := val( right( cHeader, 9 ) )
                   cMensRec    := space( nLenMensRec )
                   if nLenMensRec > 0
                      InetRecvALL( oSocket, @cMensRec, nLenMensRec )  
                   endif
 
                   if substr(cHeader,69,4) <> '1100' .or. nLenMensRec <> len( cMensRec ) // Erro Transmissão
                      lRetorno := .f.
                      lReceber := .t.
                   else
                            lRetorno := .t.
                            lReceber := .t.
                   endif
                   loop
                endif         
 
                
                // Verificar se houve erro na transação
                if substr(cHeader,69,4) = '0000' .and. len(cHeader) = 101  // Sem problemas na comunicação
                        nLenMensRec := val( right( cHeader, 9 ) )
                        cMensRec    := space( nLenMensRec )
                        
                        if nLenMensRec > 0
                           InetRecvALL( oSocket, @cMensRec, nLenMensRec )  
                                endif
                                
                        if nLenMensRec <> len( cMensRec ) // Erro Transmissão
                           lRetorno := .f.
                           cMensRec := cHeader
                        elseif cTipoOperacao == 'P' .and. val( substr(cHeader,57,4) ) > 0 // Ok
                           cMensRec := cHeader + rtrim(cMensRec)
                        elseif nLenMensRec = len( cMensRec ) // Ok  (Consulta ou Confirmação)
                           cMensRec := cHeader + rtrim(cMensRec)
                        else  // Erro eventual
                           lRetorno := .f.
                           cMensRec := rtrim(cMensRec)
                        endif
                     elseif len(cHeader) <> 101
                       lRetorno := .f.
                       cMensRec := cHeader
                     else 
                        nLenMensRec := val( right( cHeader, 9 ) )
                        cMensRec    := space( nLenMensRec )
                        if nLenMensRec > 0
                          InetRecvALL( oSocket, @cMensRec, nLenMensRec ) 
                        endif
                        lRetorno := .f.
                        cMensRec := rtrim(cMensRec)
                endif 
                sysrefresh()
                lreceber := .t.
        endif
enddo
 
if !lReceber
   lRetorno := .f.
endif
return lRetorno
//////////////////////////////////////////////////////////////////////
 
 
Acho que com isso, vc consiga resolver o seu problema.
 
Um abraço,
 
Alexandre Pereira
Link to comment
Share on other sites

Olá Theotokos, o socket serve para conectar um ou mais micros como fazemos na conexão com http, só que eu estou criando para fazer um servidor na loja central que irá receber varias solicitações e processar e devolver uma consulta de produtos ou relatórios gerados, eu peguei os exemplos da pasta da Fivewin o sockcki.prg e o sockserv.prg.

 

Alex valeu pela atenção, consegui fazer funcionar bem, deste modelo que vc me passou eu já usava com a lib wvw mas agora estou fazendos com a Fivewin e estou usando a classe do tsocket e não estava funcionando quando o servidor ficava fora do ar, agora consegui resolver colocando para testar o IP do servidor antes de enviar ou de receber para não ficar mais travado esperando resposta do servidor. ;)

Link to comment
Share on other sites

  • 7 years later...

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...