[Cascavel-pm] Socket

Alexei Znamensky russoz em gmail.com
Sábado Dezembro 18 04:34:58 PST 2010


2010/12/18 Agnaldo Macedo <agnaldo em starweb-software.com.br>

>
> Olá pessoal.
>
> Tenho uma programa que recebe conexões via scoket (o código esta abaixo).
> Meu problema é que nesse ponto
>     print "Aguardando ...";
>     my $new_sock = $sock->accept();
>     print "Processando ...";
>     my $data = '';
>     $data = <$new_sock>;
>     print "Dados recebidos ...";
> às vezes, por motivo de "alguma coisa" no client que faz a conexão, ele
> trava.
> Eu fico com e mensagem de "Processando ..." na tela.
> Ou seja, na instrução
>     $data = <$new_sock>;
> ele fica lendo, lendo, lendo e não chega ao final.
> Não sei se é falta de algum "byte" finalizado da mensagem, ou se apenas
> problema de time out e ele fica esperando.
> Teria algo que eu pudesse "quebrar" a conexão e seguir adiante, sem ficar
> preso ali.
>
>
>
> use warnings;
> use strict;
> use IO::Socket;
>
> $| = 1;
>
> my $sock = IO::Socket::INET->new (LocalPort => 8010, Type => SOCK_STREAM,
> timeout => 120, Proto => 'tcp', Listen => 50);
> unless ($sock) { die "Servidor não pode ser criado" }
> print "Servidor iniciado\n";
>
> my $continua = 'SIM';
> while ($continua eq 'SIM')
>  {
>     print "Aguardando ...";
>     my $new_sock = $sock->accept();
>     print "Processando ...";
>     my $data = '';
>     $data = <$new_sock>;
>     print "Dados recebidos ...";
>
>     if ($data)
>            {
>               print "Dados disponiveis ...\n";
>            }
>        else
>            {
>               print "Nada a processar!\n";
>            }
>     close ($new_sock);
>  }
> close($sock);
> exit(0);
> _______________________________________________
> Cascavel-pm mailing list
> Cascavel-pm em pm.org
> http://mail.pm.org/mailman/listinfo/cascavel-pm
>

Agnaldo,

Pode ser várias coisas. Pode ser TIME_WAIT [1], pode ser limites do SO.
Sugiro você dar uma olhada no módulo Net::Server [2] para não ficar
reinventado a roda. Ou, extrapolando um pouco, e presumindo o que você
pretende fazer com esse código, já ir apra uma solução mais robusta, como
algum sistema de messaging. Não mexi ainda com ele, mas o pessoal aqui do
Perl tem falado muito bem do RabbitMQ [3].

Existem vários níveis de "rodas" que pode ser reinventados. A não ser que
você *queira* fazer isso, talvez para aprender como funcionam as coisas, não
acho que valha muito a pena.

my $twocents;

[]s,
-- 
Alexei Znamensky [russoz_gmail_com] [russoz.wordpress.com] [
www.flickr.com/photos/alexeiz]
«Only love / Can bring the rain / That makes you yearn to the sky»

[1] http://developerweb.net/viewtopic.php?id=2941
[2] http://lmctfy.org/Net::Server
[3] http://www.rabbitmq.com/
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://mail.pm.org/pipermail/cascavel-pm/attachments/20101218/124690de/attachment.html>


Mais detalhes sobre a lista de discussão Cascavel-pm