Ich habe ein einfaches Socket-Perl-Server-Skript unter Cygwin Xinetd hinzugefügt, um die Client-Eingabe wiederzugeben, aber es liest stattdessen leer

Ich habe ein einfaches Socket-Perl-Server-Skript unter Cygwin Xinetd hinzugefügt, um die Client-Eingabe wiederzugeben, aber es liest stattdessen leer

Ich habe eine x32-Version 1.7.33 von Cygwin auf meinem x64-Windows7-Rechner installiert.

Ich habe unter /etc/xinetd.d/ccapi einen neuen Dienst hinzugefügt.

$ 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
}

Ich habe die xinetd-README-Datei zur Installation von xinetd befolgt und es gestartet:

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

Der Befehl " ps -ef" zeigt an, dass xinetd ausgeführt wird.

Die Datei server_xinet.exe ist ein kompiliertes ActiveState-Perl-Skript. Es gibt wieder, was es vom Client empfängt:

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

Das Perl-Client-Skript sendet einfach eine Zeichenfolge an Port 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);

Ich habe dieses Client-Skript auf derselben Maschine ausgeführt und es empfängt nichts vom Server

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

Ich habe das local.log überprüft und dort einen neuen Eintrag gefunden:

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

Dies bedeutet, dass Cygwin xinetd server_xinet.exe startet.

Das Problem besteht darin, dass der Server nichts von liest <STDIN>und dass der Client das, wohin er schreibt <STDOUT>, nicht empfängt.

Ich habe dies von einer Unix-Maschine portiert und dort funktioniert es einwandfrei.

Was ist hier das Problem in Cygwin?

Vielen Dank für Ihre Hilfe.

Antwort1

Ich habe es endlich geschafft, dass mein Client/Server miteinander kommunizieren. Ich habe mich entschieden, Cygwin Perl zu verwenden, um sowohl den Server als auch den Client auszuführen, und es funktioniert. Anstelle von /cygdrive/c/ccintegration/scripts/cygwin/server_xinet.exe (kompiliert mit ActiveState PDK) in /etc/xinetd.d/ccapi-stream habe ich es durch /cygdrive/c/ccintegration/scripts/cygwin/server_xinet.pl ersetzt. Verwenden Sie dann „#!/usr/bin/perl“ als erste Zeile sowohl in server_xinet.pl als auch in simpleClient.pl.

./simpleClient.pl „Das funktioniert“ Echo vom Server:

Grüße, alma

verwandte Informationen