Agregué un script de servidor perl de socket simple en Cygwin Xinetd para hacer eco de la entrada del cliente, pero en su lugar se lee en blanco.

Agregué un script de servidor perl de socket simple en Cygwin Xinetd para hacer eco de la entrada del cliente, pero en su lugar se lee en blanco.

Instalé una versión x32 1.7.33 de Cygwin en mi máquina x64 con Windows7.

Agregué un nuevo servicio en /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
}

Seguí el xinetd-README para instalar xinetd y lo inicié:

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

El comando " ps -ef" muestra que xinetd se está ejecutando.

server_xinet.exe es un script perl ActiveState compilado. Se hace eco de lo que recibe del 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;

El script Perl del cliente simplemente envía una cadena al puerto 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);

Ejecuté este script de cliente en la misma máquina y no recibe nada del servidor.

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

Revisé local.log y encontré una nueva entrada allí:

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

Esto significa que cygwin xinetd inicia server_xinet.exe.

El problema es que el servidor no lee nada <STDIN>y cualquier cosa que escriba <STDOUT>, el cliente no lo recibió.

Porté esto desde una máquina Unix y funciona bien allí.

¿Cuál es el problema aquí en Cygwin?

Gracias por cualquier ayuda que usted nos pueda proporcionar.

Respuesta1

Finalmente logré que mi cliente/servidor hablaran entre sí. Decidí usar cygwin perl para ejecutar tanto el servidor como el cliente y funciona. En lugar de /cygdrive/c/ccintegration/scripts/cygwin/server_xinet.exe (compilado usando ActiveState PDK) en /etc/xinetd.d/ccapi-stream, lo reemplacé con /cygdrive/c/ccintegration/scripts/cygwin/server_xinet .pl Luego use '#!/usr/bin/perl' como primera línea tanto en server_xinet.pl como en simpleClient.pl.

./simpleClient.pl "Esto está funcionando" Eco del servidor:

Saludos alma

información relacionada