[Cascavel-pm] Problema com autoflush em sockets

Luis Motta Campos luismottacampos em yahoo.co.uk
Quinta Maio 31 11:29:27 PDT 2007


On May 31, 2007, at 6:25 PM, Nilson Santos Figueiredo Junior wrote:
> Olá pessoal,
>
> Estou tentando fazer engenharia reversa do protocolo de comunicação de
> um applet Java sem muito sucesso. Meu problema é que não estou
> conseguindo fazer com que o autoflush funcione corretamente de forma
> alguma.
[corta!]
> Alguém tem alguma idéia do que pode ser?

   Vamos começar devagar.
   O que é isso? É um web service? Que protocolo é este? É  
proprietário? Você tem acesso ao fonte do Java?
   Por que você optou por usar uma coisa de tão baixo nível como o  
IO::Socket::INET?
   Não tem um módulo Perl que fale com este serviço?
   Isto é um serviço pago? Qualquer pessoa pode usar?
   Onde está a especificação do cliente Java?

   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...

   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.

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

   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).

#!/usr/bin/perl
use warnings;
use strict;
use IO::Socket::INET;

print qq{Creating socket...};
my $socket = new IO::Socket::INET( PeerAddr => 'stream2.advfn.com',  
PeerPort => 7_000, Blocking => 0 )
     or die qq{Couldn't connect: $!};
print qq{ done.$/};

print q{Socket is a } . ref( $socket ) . '.' . $/;

my $handshake = qq{\x02\x04\x05\xB4\x01\x01\x04\x02};
print qq{Sending handshake...};
$socket->write( $handshake, length $handshake );
print qq{ done.$/};

print qq{Waiting for server answer...};
my $buffer;
$socket->read( $buffer, length $handshake );
print qq{ done. Answer is "$buffer".\n\n};
__END__

   Com mais informações, posso ajudar mais.
   Putamplexos!
--
Luis Motta Campos (a.k.a. Monsieur Champs) is a software engineer,
Perl fanatic evangelist, and amateur {cook, photographer}




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