Eu adicionei um script de servidor perl de soquete simples no Cygwin Xinetd para ecoar a entrada do cliente, mas ele lê em branco

Eu adicionei um script de servidor perl de soquete simples no Cygwin Xinetd para ecoar a entrada do cliente, mas ele lê em branco

Instalei uma versão x32 1.7.33 do Cygwin em minha máquina x64 Windows7.

Adicionei um novo serviço em /etc/xinetd.d/ccapi.

$ cat ccapi-stream
service ccapi
{
        id = ccapi-stream
        disable = no
        socket_type = stream
        protocol = tcp
        wait = no
        user = alma
        server = /cygdrive/c/ccintegration/scripts/cygwin/server_xinet.exe
        port = 49300
}

Segui o xinetd-README para instalar o xinetd e iniciei-o:

cygrunsrv -I xinetd -d "CYGWIN xinetd" -p /usr/sbin/xinetd -a "-stayalive -dontfork" -y tcpip -u alma -w xxx
cygrunsrv -S xinetd

O comando " ps -ef" mostra que o xinetd está em execução.

O server_xinet.exe é um script perl ActiveState compilado. Ele ecoa o que recebe do cliente:

...
open($localLog ">> local.log");
$rdata = <STDIN>;
chomp($rdata);
print $localLog "  Data Received at $d $t: <$rdata>\n";  # so I know xinetd loads this exe
close $localLog;

# write response data to the connected client
print STDOUT "You said: $rdata\n";
exit;

O script perl do cliente apenas envia uma string para a porta 49300.

$HOST = "127.0.0.1";  # also tried using hostname "HOST.xxx.com";
$PORT = "49300";
$data = "@ARGV";

$socket = IO::Socket::INET->new(
    PeerAddr => "$HOST",
    PeerPort => "$PORT",
    Proto => "tcp",
    );
die "Could not connect to $HOST:$PORT : $@\n" unless $socket;

  print $socket "$data\n";
  $socket->flush();
  $answer = <$socket>;
  print "Echo from server: <$answer>\n";
close($socket);

Executei esse script cliente na mesma máquina e ele não recebe nada do servidor

$ perl simpleClient.pl "This is it:"
Echo from server: <>

Verifiquei o local.log e encontrei uma nova entrada lá:

Data Received at 2015mar12 10:11:39: <>

Isso significa que o cygwin xinetd inicia server_xinet.exe.

O problema é que o servidor não lê nada <STDIN>e tudo o que escreve <STDOUT>, o cliente não recebeu.

Eu portei isso de uma máquina Unix e funciona bem lá.

Qual é o problema aqui no Cygwin?

Obrigado por qualquer ajuda que você possa fornecer.

Responder1

Finalmente consegui fazer meu cliente/servidor conversar entre si. Decidi usar o cygwin perl para executar o servidor e o cliente e funciona. Em vez de /cygdrive/c/ccintegration/scripts/cygwin/server_xinet.exe (compilado usando ActiveState PDK) em /etc/xinetd.d/ccapi-stream, substituí-o por /cygdrive/c/ccintegration/scripts/cygwin/server_xinet .pl Em seguida, use '#!/usr/bin/perl' como a primeira linha em server_xinet.pl e simpleClient.pl.

./simpleClient.pl "Isso está funcionando" Eco do servidor:

Atenciosamente, alma

informação relacionada