1. This site uses cookies. By continuing to use this site, you are agreeing to our use of cookies. Learn More.

  2. Anuncie Aqui ! Entre em contato fdantas@4each.com.br

Duvida Tempo de Resposta em conexão TPC/IP

Discussão em 'Progress 4GL' iniciado por ueluis, Maio 5, 2017.

  1. ueluis

    ueluis Membro Participativo

    Pessoal,

    utilizo o exemplo abaixo para ler resultados em conexões tcp/ip via socket.

    Código:
    DEF VAR vcaptura AS CHAR NO-UNDO.
    DEF VAR vsocket AS HANDLE NO-UNDO.
    DEF VAR mymemptr AS MEMPTR NO-UNDO.
    DEF VAR ret AS LOG NO-UNDO.
       
      CREATE SOCKET vsocket.
      ret = vsocket:CONNECT("-H 192.168.5.211 -S 3000").  
      IF NOT ret THEN DO:
      MESSAGE "Dispositivo Desconectado!" VIEW-AS ALERT-BOX.
      END.
      ELSE DO:
      SET-SIZE(mymemptr) = 100.
      SET-BYTE-ORDER(mymemptr) = BIG-ENDIAN.
      REPEAT:   
      vsocket:READ(mymemptr,1,100).
      vcaptura = GET-STRING(mymemptr,1,100).
      DISP vcaptura.   
      END.
      SET-SIZE(mymemptr) = 0.
      END.
      vsocket:DISCONNECT().  
    
    
    
    Funciona de boa o problema é que as vezes o tempo ms do dispositivo é mais rápido que a leitura , fazendo com que a informação obtida seja cortada exemplo:

    Texto enviado pelo TCP/IP:
    05/05/2017;11:49:41;PROG 01;9875215
    05/05/2017;11:49:41;PROG 01;8314526
    05/05/2017;11:49:42;PROG 01;6871357
    05/05/2017;11:49:42;PROG 01;9873658
    05/05/2017;11:49:43;PROG 01;2587469

    Texto obtido na leitura:
    9:41;PROG 01;9875215
    05/05/2017;11:
    ;PROG 01;6871357 05/05/2017;11:49:42;PROG 01;9873658
    05/05/2017;11:49:42;PROG 01;9873658
    05/05/2017;11:49:43;PROG 01;2587469

    eu testei exibindo com comando display do progress, fica bem explicito que o tempo de atualização está mais lento em relação ao dispositivo.

    A pergunta é existe algum comando para eu setar o tempo em ms para que eu consiga o resultado similar ao hyperterminal do windows?
  2. bootstrapmaster

    bootstrapmaster Moderator Moderador Equipe de Suporte

  3. ueluis

    ueluis Membro Participativo

    @bootstrapmaster ,
    consegui resolver a questão do delay, na verdade coloquei um delimitador char(13) no emissor e o programa corrigido está abaixo, o que eu preciso e não consegui fazer é colocar os dados dentro de uma temp-table pois em minhas tentativas sempre corta o texto porque a variavel não entende a quebra de linha conforme o notepad++. Sendo Assim como armazenar cada linha dentro de uma temp-table? Vou anexar o arquivo com os dados conforme vem do get do tcp.
    Com esse exemplo vc consegue pegar o resultado de qualquer porta que esteja trasnmitindo dados por tcp via socket e armazenar no txt.
    Código:
    
    
    DEF VAR vcaptura AS CHAR NO-UNDO FORMAT "x(100)" .
    DEF VAR vtam_dados AS INT NO-UNDO INIT 100.
    DEF VAR vsocket AS HANDLE NO-UNDO.
    DEF VAR mymemptr AS MEMPTR NO-UNDO.
    DEF VAR ret AS LOG NO-UNDO.
    
    OUTPUT TO VALUE ("c:\temp\teste.txt").
      
        CREATE SOCKET vsocket.
         ret = vsocket:CONNECT("-H 192.168.5.13 -S 3001"). 
          IF NOT ret THEN DO:
                MESSAGE "Dispositivo Desconectado!" VIEW-AS ALERT-BOX.
            END.
            ELSE DO:
                REPEAT:  
                    vsocket:SET-SOCKET-OPTION("SO-RCVTIMEO", "1").
                    IF vSocket:connected() THEN DO:
                     WAIT-FOR READ-RESPONSE OF vSocket.
                        SET-SIZE(mymemptr) = vtam_dados.
                        SET-BYTE-ORDER(mymemptr) = BIG-ENDIAN.
                        vsocket:READ(mymemptr,1,vtam_dados).
                        vcaptura = GET-STRING(mymemptr,1).
                        PUT vcaptura.
                        SET-SIZE(mymemptr) = 0.
                    END.
                    ELSE
                    LEAVE.
                END.
            END.
            vsocket:DISCONNECT().
            DELETE OBJECT vsocket.
    
       OUTPUT CLOSE.   

    Arquivos Anexados:

  4. bootstrapmaster

    bootstrapmaster Moderator Moderador Equipe de Suporte

    Normalmente, no progress, quebra de linha é chr(10), eu daria uma de escovador de BITS nesse momento, e colocaria um message mostrando o conteudo de vcaptura, o chr() e o ASC() dele, pra determinar qual caracter está sendo usado como quebra de linha.
  5. ueluis

    ueluis Membro Participativo

    eu parametrizei para a quebra ser char(13) , como vou fazer para que em tempo de execução eu armazenar na temp-table cada linha sendo que o repeat vai abastencendo a variavel vcaptura, eu teria que arrumar um jeito de bufferizar o que estou recebendo , quebrar a linha para ir jogando para o arquivo e esvaziando o buffer.

    exemplo:
    tt-temp.dados = "09/05/2017;09:44:08;PROG 01;9651254|".

    a dificuldade é justamente ler a variavel dentro do repita e quando formar a frase "09/05/2017;09:44:08;PROG 01;9651254|" jogar pra tabela e continuar lendo.

    consegue pensar em alguma coisa do tipo?
  6. bootstrapmaster

    bootstrapmaster Moderator Moderador Equipe de Suporte

    mas vc já tem o | (pipe) como limitador,
    Cria uma variavel chamada linha por exemplo, e e faça assign linha = linha + vcaptura até o momento que achar o | (pipe), dai vc salva isso na temp-table e limpa linha para continuar recebendo
    ueluis curtiu isso.

Compartilhe esta Página