[SP-pm] duvida sockets e select

Thiago Rondon thiago at aware.com.br
Sun Nov 25 07:32:56 PST 2012


Tiago,

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.

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.

Me parece que teu problema, exige algo orientada a blocos, algo como alguns protocolos já funcionam assim.

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.

Se for por blocos, por exemplo separado por duas linhas, fica mais simples, pois você pode ter algo como:

$buffer =~ s/^(.+)(?:\015\012\015\012)//sox

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.

abs!
-Thiago Rondon


On Saturday, November 24, 2012 at 7:52 PM, Tiago Peczenyj wrote:

> Ok
>  
> Recebi a dica de usar sysread e "funciona"
>  
> 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.  
>  
> pensei em algo como
>  
> while ($buf =~ s/^(.*)\n//) { process_message("$1"); }
> mas como eu faço na situação
>  
> envio  
>  
> linha1
> linha2
> linha3
>  
> e quando leio...
>  
> buffer => "linha1\r\nlin";
>  
> eu preciso guardar o "lin" pra proxima fase. tem alguma forma menos obscura de faze-lo?  
>  
> 2012/11/24 Tiago Peczenyj <tiago.peczenyj em gmail.com (mailto:tiago.peczenyj em gmail.com)>
> > Ola Galera
> >  
> > Eu tenho algo mais ou menos assim
> >  
> > https://gist.github.com/4141422
> >  
> > O que acontece é que, se eu fizer  
> >  
> > bash$ (echo "xxx" ;sleep 30 ; echo "yyy") | nc localhost 9090
> >  
> > ta de boa, o xxx e o yyy são impressos em momentos distintos mas
> >  
> > bash$ (echo -n "xxx" ;sleep 30 ; echo "yyy") | nc localhost 9090
> >  
> > O server TRAVA enquanto  
> >  
> > 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.  
> >  
> > achei q era o getline mas substituindo por getc para ler caracter a caracter eu só consigo ler o primeiro antes de travar.
> >  
> > alguma ideia?
> >  
> > outra coisa, eu suportamente tenho que ler um protocolo simples, uma linha com um padrão, como  
> >  
> > a|b|c|d\r\n
> >  
> > 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?  
> >  
> > Obrigado
> >  
> >  
> >  
> > --  
> > Tiago B. Peczenyj
> > Linux User #405772
> >  
> > http://pacman.blog.br
>  
>  
>  
> --  
> Tiago B. Peczenyj
> Linux User #405772
>  
> http://pacman.blog.br
> =begin disclaimer
> Sao Paulo Perl Mongers: http://sao-paulo.pm.org/
> SaoPaulo-pm mailing list: SaoPaulo-pm em pm.org (mailto:SaoPaulo-pm em pm.org)
> L<http://mail.pm.org/mailman/listinfo/saopaulo-pm>
> =end disclaimer





More information about the SaoPaulo-pm mailing list