[SP-pm] duvida sockets e select

Tiago Peczenyj tiago.peczenyj at gmail.com
Sun Nov 25 04:55:02 PST 2012


Eu quero fazer em perl puro antes de usar uma lib externa ate para comparar
;-)
Em 25/11/2012 08:05, "Solli Honorio" <shonorio at gmail.com> escreveu:

> Tiago,
>
> Sei que você é macaco velho, por isto não vou perguntar se você já
> considerou a utilização de um framework (POE, Mojo ou Net::Server por
> exemplo) para este trabalho, e nem enumerar todas as vantagens que estes
> framework tem em relação em codificar manualmente.
>
> Com relação a tua dúvida, você terá que criar uma área de buffer para
> armazenar a parte que ainda não está completa, tipo assim :
>
> <code>
>
> ...
>    $content_from_client = qq/${buffer_from_server}${content_from_client}/;
>    my $rindex           = rindex $content_from_client, qq/\n/;
>    $buffer_from_server  = substr $content_from_client, ++$rindex;
>
> ...
>
> </code>
>
> Como vc está observando, a vida de um server não é simples. A reconstrução
> dos dados é um trabalho penoso e quase mágico (e nem estamos falando de
> acesso blocking/non-blocking, gerenciamento de forks/threads, etc), e é por
> isto e outras coisas que os frameworks são recomendadíssimo.
>
> Abraços,
>
> Solli Honorio
>
>
> Em 24 de novembro de 2012 19:52, Tiago Peczenyj <tiago.peczenyj at gmail.com>escreveu:
>
>> 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 at 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 at pm.org
>>  L<http://mail.pm.org/mailman/listinfo/saopaulo-pm>
>> =end disclaimer
>>
>>
>
>
> --
> "o animal satisfeito dorme". - Guimarães Rosa
>
> =begin disclaimer
>    Sao Paulo Perl Mongers: http://sao-paulo.pm.org/
>  SaoPaulo-pm mailing list: SaoPaulo-pm at pm.org
>  L<http://mail.pm.org/mailman/listinfo/saopaulo-pm>
> =end disclaimer
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.pm.org/pipermail/saopaulo-pm/attachments/20121125/33e201a7/attachment.html>


More information about the SaoPaulo-pm mailing list