[Cascavel-pm] Problema com autoflush em sockets

Nilson Santos Figueiredo Junior acid06 em gmail.com
Quinta Maio 31 12:12:03 PDT 2007


On 5/31/07, Luis Motta Campos <luismottacampos em yahoo.co.uk> wrote:
>    O que é isso? É um web service? Que protocolo é este? É
> proprietário? Você tem acesso ao fonte do Java?

É um protocolo bizarro proprietário.
Estou dando uma olhada no fonte decompilado aqui agora... código
gigantesco e meio porco, ainda não consegui localizar aonde está o
protocolo mesmo, possivelmente é algo espalhado por várias das 200
classes.

>    Por que você optou por usar uma coisa de tão baixo nível como o
> IO::Socket::INET?

Porque não é um protocolo padrão. É simplesmente um protocolo home
grown que eles usam pro applet Java se comunicar com o servidor.

>    Isto é um serviço pago? Qualquer pessoa pode usar?

É um serviço gratuito, mas limitado. O que eu quero fazer é não
precisar de utilizar o applet Java pra poder fazer aplicações
arbitrárias e mais interessantes.

>    Onde está a especificação do cliente Java?

Não existe.

>    Qual é a versão do seu IO::Socket::INET? Do manual do meu:
>
>      As of VERSION 1.18 all IO::Socket objects have autoflush turned on
>      by default. This was not the case with earlier releases.
>
>    Acho que você não precisa se preocupar com o Autoflush.
>    Mas eu gostaria de entender o seu problema...

De fato, no meu também tem isso escrito. Eu uso o IO::Socket::INET de
cabeça mesmo, então nem tinha olhado na documentação.

>    Outra coisa: me parece que você aceitou o default de ter BLOCKING
> READS (já que você não disse "Blocking => 0" no construtor). Quando
> eu acrescentei isto, minhas leituras não bloquearam mais.

Eu *quero* que bloqueie. O problema é que ela deve bloquear só
enquanto não tem nada, entendeu? Quando chega algo, desbloqueia. Pra
isso você usa método can_read() de um IO::Select, sem timeout.

E, mesmo se eu quisesse um socket nonblocking, simplesmente setar
Blocking => 0 não funciona sob Windows, dá erro porque a implementação
por baixo não suporta (mas existe outra forma mais "pé duro" de fazer
isso acontecer, se alguém precisar basta buscar referências sobre o
assunto no PerlMonks).

>    Infelizmente, parece que o seu serviço é dedicado para o seu IP,
> já que eu consigo apenas "connection refused" quando tento usar ele.

Não, não é. Ele é público. É um site brasileiro sobre stock trading:

  http://br.advfn.com

Bom, talvez o processo de login no site "autorize" o IP no back-end
deles, realmente não sei. Mas aposto mais em alguma restrição aí do
seu lado. ;-)

>    Aqui tem o código que eu copiei / brinquei, para você ter uma
> referência. Deve estar muito parecido com o seu (já que foi com ele
> que eu comecei).

Acontecem os mesmos resultados. E, no Linux, onde o Blocking => 0 é
suportado, ele simplesmente não lê nada de volta.

Em situações normais eu iria assumir que o servidor de alguma forma
não está respondendo o meu cliente "não-oficial". Contudo, a resposta
do servidor chega de volta no meu monitorador de pacotes.

Ainda estou sem entender porque o Perl não está "enxergando" isso.

-Nilson Santos F. Jr.


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