[SP-pm] Socket - algumas questões:

Stanislaw Pusep creaktive at gmail.com
Tue May 3 12:57:06 PDT 2011


Existem outros frameworks, mais leves e mais específicos, tal como:
http://search.cpan.org/~rhandom/Net-Server-0.99/
E... BEWARE UDP!!! Tive oportunidade de presenciar pacotes sendo perdidos e
fora de ordem numa LAN, imagine em Internet!

ABS()



2011/5/3 Andre Carneiro <andregarciacarneiro em gmail.com>

> Oi Solli!
>
>
> Exatamente! Quando eu tento o raio do getline, ele não me traz nada apesar
> de escrever no socket, mas com certeza tem alguma coisa errada que eu não
> estou vendo. Talvez haja algum problema com a ordem que eu estou fazendo as
> coisas, sei lá. Vou dar uma fuçada no seu código e comparar as coisas pra
> descobrir.
>
>
> Sobre usar um framework, eu tô fazendo uns testes com o AnyEvent. Eu
> sinceramente acho POE muuuuito grande e complicado para o meu cérebro
> limitado. Já com o AnyEvent eu tô conseguindo me entender melhor.
>
>
> Sobre o livro, já tá na minha lista desse ano para comprar.
>
>
> Sobre usar UDP acho que não vale a pena por enquanto. Mesmo pq já tenho um
> deadline bem apertado pra entregar essa meleca. Então deixa pra lá. Talvez
> numa outra versão
>
>
> Thx a lot!
>
>
> Cheers!
>
>
>
>
>
> 2011/5/3 Solli Honorio <shonorio em gmail.com>
>
>>
>>
>>
>> Uma das maneiras é assim :
>>
>> <code>
>>
>> #!/usr/bin/env perl
>> use strict;
>> use IO::Socket::INET;
>>
>> my $quit = 0;
>>
>> $SIG{INT} = sub { $quit++ };
>>
>> my $listen_socket = IO::Socket::INET->new(LocalPort => 2121,
>>                                         Listen    => 2,
>>                                         Proto     => 'tcp',
>>                                         Reuse     => 1,) or die "$!";
>>
>> while ( !$quit ) {
>>   next unless my $connection = $listen_socket->accept;
>>
>>   defined ( my $child = fork() ) or die "Can't fork: $!";
>>
>>   if ( $child == 0 ) {
>>     $listen_socket->close;
>>     do_something($connection);
>>     exit 0;
>>   }
>>
>>   $connection->close;
>>
>> }
>>
>> sub do_something {
>>   my $socket = shift;
>>
>>   $socket->autoflush(1);
>>   $socket->print("Entre com os numeros para calculo:\n");
>>
>>   while ( 1 ) {
>>     my $input = $socket->getline();
>>     exit 0 if $input =~ /quit/i;
>>     $socket->print($input);
>>   }
>>
>> }
>>
>> <code>
>>
>> O código acima é um echo server muito simples, que ilustra bem uma
>> comunicação bi-direcional. Não sei onde você está utilizando este código,
>> mas eu recomendo muito cuidado. Existem vários problemas com código deste
>> tipo (I/O Blocking, por exemplo) e uma enorme quantidade de coisas que podem
>> ocorrer de errado.
>>
>> Tenho um livro (Networking Programming with Perl) de 700 páginas só
>> falando de tudo que pode dar errado num código deste tipo e todas (ou quase)
>> variações de servidores escrito em Perl (tcp, udp, I/O Blocking, I/O
>> Nonblocking, forked, threaded). Utilizar print/getline, write/read,
>> syswrite/sysread é apenas o começo das perguntas de arquitetura que temos
>> que responder para um servidor.
>>
>> Se for possível, eu recomendo fortemente que você utilize um framework
>> para fazer isto, tipo o POE (
>> http://poe.perl.org/?POE_Cookbook/TCP_Servers tem um exemplo do mesmo
>> código que eu escrevi). Se não for possível, eu recomendo você dar uma
>> olhada no livro que eu disse (posso emprestar se for o caso). Temos também o
>> Mojolicious com os websocket (estou começando a ver isto), pode ser uma boa
>> alternativa.
>>
>> - Preciso de protocolo específico para fazer isso ?
>>>
>>
>> Uma conversa bi-direcional, você precisa definir os comandos que um vai
>> aceitar do outro. Você terá que criar algum protocolo de qualquer maneira,
>> uma linguagem que seja compreendida pelo servidor e cliente, qual como o
>> HTTP, FTP ou SMTP. Na transferência de arquivo, recomendo fortemente no
>> formato JSON. Aliais, este teu sistema não seria candidato para ser um
>> webapp com RESTfull web services implementado em Catalyst ou Mojolicious ?
>> Neste ambiente O URI é a função que recebe/retorna em JSON, sem view em html
>> !
>>
>>
>>> - Eu vi algumas pessoas usando udp ao invés de tcp alegando aumento de
>>> performance, mas abrindo mão de vários quesitos de segurança dentre outros
>>> problemas. Confirma?
>>>
>>>
>> Sim, o UDP é mais 'leve' do que o 'tcp'. Mas isto significa que você terá
>> que tratar tudo relacionado a transferência de dados (ordem dos pacotes,
>> perda dos pacotes, etc). Uma recomendação, a menos que você saiba muito bem
>> o que está fazendo, e que o consumo de rede seja justificado, não utilize o
>> UDP, o overhead para o programador não vale a pena. O HTTP utiliza TCP e
>> ninguém pensou em mudar isto, não siga os líderes :D ....
>>
>>
>>> Cheers!
>>>
>>>
>>> --
>>> André Garcia Carneiro
>>> Analista/Desenvolvedor Perl
>>> (11)82907780
>>>
>>> =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
>>
>> =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
>>
>>
>
>
> --
> André Garcia Carneiro
> Analista/Desenvolvedor Perl
> (11)82907780
>
> =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
>
>
-------------- Pr�xima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://mail.pm.org/pipermail/saopaulo-pm/attachments/20110503/d12af4a4/attachment.html>


More information about the SaoPaulo-pm mailing list