클라이언트 입력을 에코하기 위해 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 "작동 중입니다" 서버의 에코:

감사합니다, 앨마

관련 정보