uma parte do meu protocolo é<div><br></div><div>timestamp<SEPARADOR>tipo<SEPARADOR>etc..CRLF</div><div><br></div><div>sendo meu separador algo arbitrario, uma virgula por exemplo. é uma string utf-8</div><div><br>

</div><div>eu criei um buffer para entra entrada e vou acumulando até encontrar uma linha e assim processar</div><div><br></div><div>meu problema era que como eu tenho que rotear estes eventos para outros clientes baseados em regras internas, tenho que usar I/O nonblocking para não ficar travado se um cliente não esta lendo/escrevendo (meu cliente só se identifica), ou se a fonte de eventos não esta escrevendo. agora eu resolvi isso de forma razoavel mas tudo esta sobrecarregado em um processo. se eu quiser  usar outros processos ou mesmo outras maquinas fisicas eu tenho que pensar mais um pouco pois eu tenho um estado interno (baseado nos eventos) que preciso replicar e aquela coisa toda que a gente resolve usando banco de dados, filas de mensagens, load balance, sistema de arquivos, etc. como é prova de conceito não quero sobracarregar com muita coisa que agora eu não preciso.<br>

<br><div class="gmail_quote">2012/11/25 Thiago Rondon <span dir="ltr"><<a href="mailto:thiago@aware.com.br" target="_blank">thiago@aware.com.br</a>></span><br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

<br>
Tiago,<br>
<br>
Uma pergunta: Qual o padrão do teu protocolo ? Me parece que o maior problema aqui é a falta de um padrão para disposição e processamento.<br>
<br>
Basicamente, a pergunta: É orientado a linhas ou é a blocos ? Deve ser respondida tanto do lado de disposição, como de processamento. E ela deve ser bem "clara" e "suave" para ambas na minha opinião.<br>


<br>
Me parece que teu problema, exige algo orientada a blocos, algo como alguns protocolos já funcionam assim.<br>
<br>
Mas, voltando ao problema. Se for a linha, para solucionar o seu problema, você provavelmente vai ter que depender de um "histórico" comum, como por exemplo criar uma pilha de processamento, e manter o tamanho desta pilha em um determinado tamanho, o que também deve ser "especificado" no protocolo, qual o tamanho que ela pode ter, e quais características ela deve ter. Como por exemplo, o que defini que uma linha vai para um buffer, ou não, e por aí vai.<br>


<br>
Se for por blocos, por exemplo separado por duas linhas, fica mais simples, pois você pode ter algo como:<br>
<br>
$buffer =~ s/^(.+)(?:\015\012\015\012)//sox<br>
<br>
O uso do POE é bem interessante neste caso, pois ele oferece o método "anyevent_read_type" para definir o formato do seu protocolo na sua classe, e "configurando" ela de forma que corresponde ao teu protocolo, todo o resto fica bem mais simples de se manusear e sem muitos efeitos colaterais.<br>


<br>
abs!<br>
-Thiago Rondon<br>
<div class="im"><br>
<br>
On Saturday, November 24, 2012 at 7:52 PM, Tiago Peczenyj wrote:<br>
<br>
> Ok<br>
><br>
> Recebi a dica de usar sysread e "funciona"<br>
><br>
> entretanto o meu problema é: eu tenho um protocolo orientado a linhas, cada linha é um "evento" que eu preciso processar. posso pegar uma linha pela metade e eu teria que guardar para "emendar" no proximo loop.<br>


><br>
> pensei em algo como<br>
><br>
> while ($buf =~ s/^(.*)\n//) { process_message("$1"); }<br>
> mas como eu faço na situação<br>
><br>
> envio<br>
><br>
> linha1<br>
> linha2<br>
> linha3<br>
><br>
> e quando leio...<br>
><br>
> buffer => "linha1\r\nlin";<br>
><br>
> eu preciso guardar o "lin" pra proxima fase. tem alguma forma menos obscura de faze-lo?<br>
><br>
</div>> 2012/11/24 Tiago Peczenyj <<a href="mailto:tiago.peczenyj@gmail.com">tiago.peczenyj@gmail.com</a> (mailto:<a href="mailto:tiago.peczenyj@gmail.com">tiago.peczenyj@gmail.com</a>)><br>
<div class="im">> > Ola Galera<br>
> ><br>
> > Eu tenho algo mais ou menos assim<br>
> ><br>
> > <a href="https://gist.github.com/4141422" target="_blank">https://gist.github.com/4141422</a><br>
> ><br>
> > O que acontece é que, se eu fizer<br>
> ><br>
> > bash$ (echo "xxx" ;sleep 30 ; echo "yyy") | nc localhost 9090<br>
> ><br>
> > ta de boa, o xxx e o yyy são impressos em momentos distintos mas<br>
> ><br>
> > bash$ (echo -n "xxx" ;sleep 30 ; echo "yyy") | nc localhost 9090<br>
> ><br>
> > O server TRAVA enquanto<br>
> ><br>
> > Agora o que acontece: eu tenho que escutar em outra porta (otimi o codigo mas basicamente eu inicio outro IO::Socket::INET em outra porta e trato dentro do main loop) outros clientes e fazer coisas divertidas com eles. com o server travado eu não faço mais nada.<br>


> ><br>
> > achei q era o getline mas substituindo por getc para ler caracter a caracter eu só consigo ler o primeiro antes de travar.<br>
> ><br>
> > alguma ideia?<br>
> ><br>
> > outra coisa, eu suportamente tenho que ler um protocolo simples, uma linha com um padrão, como<br>
> ><br>
> > a|b|c|d\r\n<br>
> ><br>
> > então o getline me é util, não achei outra forma de brincar com um buffer sem ficar maluco. alias eu deveria suportar utf-8 na entrada porem eu não vi diferença no binmode, tem algum truque? estou esquecendo de algo? o common::sense ja faz algo por mim?<br>


> ><br>
> > Obrigado<br>
> ><br>
> ><br>
> ><br>
> > --<br>
> > Tiago B. Peczenyj<br>
> > Linux User #405772<br>
> ><br>
> > <a href="http://pacman.blog.br" target="_blank">http://pacman.blog.br</a><br>
><br>
><br>
><br>
> --<br>
> Tiago B. Peczenyj<br>
> Linux User #405772<br>
><br>
> <a href="http://pacman.blog.br" target="_blank">http://pacman.blog.br</a><br>
</div><div class="im">> =begin disclaimer<br>
> Sao Paulo Perl Mongers: <a href="http://sao-paulo.pm.org/" target="_blank">http://sao-paulo.pm.org/</a><br>
</div>> SaoPaulo-pm mailing list: <a href="mailto:SaoPaulo-pm@pm.org">SaoPaulo-pm@pm.org</a> (mailto:<a href="mailto:SaoPaulo-pm@pm.org">SaoPaulo-pm@pm.org</a>)<br>
<div class="HOEnZb"><div class="h5">> L<<a href="http://mail.pm.org/mailman/listinfo/saopaulo-pm" target="_blank">http://mail.pm.org/mailman/listinfo/saopaulo-pm</a>><br>
> =end disclaimer<br>
<br>
<br>
<br>
=begin disclaimer<br>
   Sao Paulo Perl Mongers: <a href="http://sao-paulo.pm.org/" target="_blank">http://sao-paulo.pm.org/</a><br>
 SaoPaulo-pm mailing list: <a href="mailto:SaoPaulo-pm@pm.org">SaoPaulo-pm@pm.org</a><br>
 L<<a href="http://mail.pm.org/mailman/listinfo/saopaulo-pm" target="_blank">http://mail.pm.org/mailman/listinfo/saopaulo-pm</a>><br>
=end disclaimer<br>
</div></div></blockquote></div><br><br clear="all"><div><br></div>-- <br>Tiago B. Peczenyj<br>Linux User #405772<br><br><a href="http://pacman.blog.br">http://pacman.blog.br</a><br>
</div>