Cygwin Xinetdにクライアント入力をエコーする簡単なソケットPerlサーバースクリプトを追加しましたが、代わりに空白が表示されます

Cygwin Xinetdにクライアント入力をエコーする簡単なソケットPerlサーバースクリプトを追加しましたが、代わりに空白が表示されます

x64 Windows7 マシンに Cygwin の x32 バージョン 1.7.33 をインストールしました。

/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 を使用することにしましたが、うまくいきました。/etc/xinetd.d/ccapi-stream の /cygdrive/c/ccintegration/scripts/cygwin/server_xinet.exe (ActiveState PDK を使用してコンパイル) の代わりに、/cygdrive/c/ccintegration/scripts/cygwin/server_xinet.pl に置き換えました。次に、server_xinet.pl と simpleClient.pl の両方で最初の行として '#!/usr/bin/perl' を使用します。

./simpleClient.pl 「動作しています」 サーバーからのエコー:

よろしく、アルマ

関連情報