[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