Я добавил простой скрипт сервера сокетов Perl под Cygwin Xinetd для отображения клиентского ввода, но вместо этого он читает пустое

Я добавил простой скрипт сервера сокетов Perl под Cygwin Xinetd для отображения клиентского ввода, но вместо этого он читает пустое

Я установил Cygwin версии 1.7.33 x32 на свой компьютер с Windows7 x64.

Я добавил новую службу в /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
}

Я следовал инструкциям xinetd-README, чтобы установить xinetd, и запустил его:

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

Команда " ps -ef" показывает, что xinetd запущен.

Server_xinet.exe — это скомпилированный скрипт ActiveState perl. Он повторяет то, что получает от клиента:

...
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;

Клиентский скрипт Perl просто отправляет строку на порт 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);

Я запустил этот клиентский скрипт на той же машине, и он ничего не получил от сервера.

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

Я проверил local.log и нашел там новую запись:

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

Это означает, что cygwin xinetd запускает server_xinet.exe.

Проблема в том, что сервер ничего не читает <STDIN>и что бы он ни записывал <STDOUT>, клиент этого не получает.

Я перенес это с машины Unix, и там все работает отлично.

В чем проблема в Cygwin?

Спасибо за любую помощь, которую вы можете оказать.

решение1

Я наконец-то заставил свой клиент/сервер общаться друг с другом. Я решил использовать cygwin perl для запуска и сервера, и клиента, и это работает. Вместо /cygdrive/c/ccintegration/scripts/cygwin/server_xinet.exe (скомпилированного с помощью ActiveState PDK) в /etc/xinetd.d/ccapi-stream я заменил его на /cygdrive/c/ccintegration/scripts/cygwin/server_xinet.pl Затем использовал '#!/usr/bin/perl' в качестве первой строки в server_xinet.pl и simpleClient.pl.

./simpleClient.pl "Это работает" Эхо с сервера:

С уважением, Альма

Связанный контент