[SP-pm] duvida sockets e select

Solli Honorio shonorio at gmail.com
Sun Nov 25 02:05:04 PST 2012


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 em 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 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
>  L<http://mail.pm.org/mailman/listinfo/saopaulo-pm>
> =end disclaimer
>
>


-- 
"o animal satisfeito dorme". - Guimarães Rosa
-------------- Pr?xima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://mail.pm.org/pipermail/saopaulo-pm/attachments/20121125/46cc96a9/attachment-0001.html>


More information about the SaoPaulo-pm mailing list