[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