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 "작동 중입니다" 서버의 에코:
감사합니다, 앨마