Dodałem prosty skrypt serwera Perla dla gniazda w Cygwin Xinetd, aby powtórzyć dane wejściowe klienta, ale zamiast tego jest pusty

0

Zainstalowałem Cygwin x32 w wersji 1.7.33 na moim komputerze z systemem Windows 7 x64.

Dodałem nową usługę pod /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
}

Śledziłem xinetd-README, aby zainstalować xinetd i uruchomiłem go:

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

Polecenie „ ps -ef” pokazuje, że xinetd jest uruchomiony.

Server_xinet.exe to skompilowany skrypt perla ActiveState. Powtarza to, co otrzymuje od klienta:

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

Skrypt perla klienta wysyła ciąg znaków do portu 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);

Uruchomiłem ten skrypt klienta na tej samej maszynie i nie otrzymuje on nic z serwera

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

Sprawdziłem local.log i znalazłem tam nowy wpis:

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

Oznacza to, że cygwin xinetd uruchamia server_xinet.exe.

Problem polega na tym, że serwer nic nie czyta, <STDIN>a cokolwiek pisze <STDOUT>, klient go nie otrzymuje.

Przeniesiłem to z maszyny z Uniksem i tam działa dobrze.

Jaki jest problem tutaj w Cygwin?

Dzięki za wszelką pomoc, którą możesz udzielić.

Alan Ma
źródło

Odpowiedzi:

0

W końcu mój klient / serwer rozmawia ze sobą. Postanowiłem użyć perl cygwin do uruchomienia zarówno serwera, jak i klienta i działa. Zamiast /cygdrive/c/ccintegration/scripts/cygwin/server_xinet.exe (skompilowany przy użyciu ActiveState PDK) w /etc/xinetd.d/ccapi-stream zastąpiłem go / cygdrive / c / ccintegration / scripts / cygwin / server_xinet .pl Następnie użyj „#! / usr / bin / perl” jako pierwszej linii zarówno w server_xinet.pl, jak i simpleClient.pl.

./simpleClient.pl „To działa” Echo z serwera:

Pozdrawiam, alma

Alma56
źródło