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

670
Alan Ma

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

Ich habe einen neuen Dienst unter /etc/xinetd.d/ccapi 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 folgte der xinetd-README zur Installation von xinetd und startete es:

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, dass xinetd ausgeführt wird.

Die server_xinet.exe ist ein kompiliertes ActiveState-Perl-Skript. Es erinnert an das, was es vom Kunden erhält:

... 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 Client-Perl-Skript sendet nur 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 dem gleichen Rechner ausgeführt und erhält vom Server nichts

$ 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 ist, dass der Server nichts liest <STDIN>und was auch immer er schreibt <STDOUT>, der Client hat es nicht erhalten.

Ich habe dies von einem Unix-Rechner aus portiert und dort funktioniert es einwandfrei.

Was ist das Problem hier in Cygwin?

Vielen Dank für Ihre Hilfe.

0

1 Antwort auf die Frage

0
Alma56

Ich habe endlich meinen Client / Server miteinander reden lassen. Ich entschied mich für cygwin perl, 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 ersetzt .pl Verwenden Sie '#! / 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