Pergunta

Estou a escrever algum código de servidor que fala com um processo cliente via STDIN. Eu estou tentando escrever um trecho de código Perl que forma assíncrona recebe respostas de STDOUT do cliente. A versão de bloqueio do código pode ter esta aparência:

sub _read_from_client
{
   my ($file_handle) = @_;
   while (my $line = <$file_handle>) {
      print STDOUT $line;
   }
   return;
}

É importante ressaltar que o trecho precisa trabalhar em plataforma Win32. Existem muitas soluções para plataformas * nix que eu não estou interessado. Eu estou usando ActivePerl 5.10.

Foi útil?

Solução

Este segmento em PerlMonks sugere que você pode fazer um soquete sem bloqueio no Windows no Perl da seguinte maneira:

ioctl($socket, 0x8004667e, 1);

Mais detalhes e recursos nesse tópico

Outras dicas

Se você não quiser ir a rota de baixo nível, você terá que olhar para as outras soluções mais frameworked.

Você pode usar um fio para ler a partir da entrada e tê-lo encher todos os dados que lê em um thread :: Queue que você então lidar no seu segmento principal.

Você pode olhar para POE que implementa uma estrutura de eventos com base, especialmente POE :: Roda :: Run :: Win32 . Potencialmente, você também pode roubar o código dele para implementar o nonblocking lê-se.

Você pode olhar [Coro], que implementa um sistema multitarefa cooperativa usando co-rotinas. Isto é principalmente semelhante ao threads, exceto que você começa tópicos do espaço do usuário, e não tópicos do sistema.

Você não declararam o quão longe você quer ir, mas sua escolha é entre sysread e um quadro, ou escrevendo disse quadro si mesmo. O caminho mais fácil para ir é apenas para tópicos de uso ou indo através do código de Poe::Wheel::Run::Win32.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top