[Cascavel-pm] Problema com autoflush em sockets
Nilson Santos Figueiredo Junior
acid06 em gmail.com
Quinta Maio 31 09:25:06 PDT 2007
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.
Eu crio meu socket da seguinte maneira:
my $socket = IO::Socket::INET->new(
PeerAddr => 'stream2.advfn.com',
PeerPort => 7000
) or die "Couldn't connect: $!";
Para habilitar o autoflush já tentei
$socket->autoflush(1)
Já tentei definir $|=1 antes e depois da criação do socket (não tinha
certeza se quando era definido fazia alguma diferença). Já tentei dar
um
bimode($socket)
já que estou sob Windows.
Também tentei dar um $socket->flush() depois de escrever e antes de
ler, sem sucesso, tanto com o autoflush habilitado quanto
desabilitado.
Já tentei também ao invés de utilizar os métodos read (e até mesmo
recv) e write, utilizar sysread e syswrite.
Nada disso funciona. Eu vejo que o servidor me enviou uma resposta
através da minha ferramenta de monitoração de pacotes mas nunca chega
no meu código. Um chamada:
$socket->read($buffer, 8);
Bloqueia eternamente e se eu utilizar IO::Select, o $select->can_read
também bloqueia eternamente. Mesmo com a resposta do servidor.
Alguém tem alguma idéia do que pode ser?
Quem quiser testar no seu sistema (vai que é algum problema aqui
comigo). Um exemplo de código de teste vai abaixo. O mais estranho é
que muito esporadicamente, o negócio funciona. 1 vez em 100 ou menos.
#!/usr/bin/perl
use warnings;
use strict;
use IO::Socket::INET;
$|=1;
my $socket = IO::Socket::INET->new(
PeerAddr => 'stream2.advfn.com',
PeerPort => 7000
) or die "Couldn't connect: $!";
$socket->autoflush(1);
print "Sending handshake...\n";
my $handshake = "\x02\x04\x05\xB4\x01\x01\x04\x02";
$socket->write($handshake, 8);
print "Waiting server response...\n";
my $buffer;
$socket->read($buffer, 8);
my $length = length $buffer;
print "Got $length bytes: [$buffer]\n";
O servidor responde com o mesmo $handshake.
Obrigado.
-Nilson Santos F, Jr.
Mais detalhes sobre a lista de discussão Cascavel-pm