これまで、バックグラウンドで常時稼動するPerlサーバを作成しました。着信接続を受信すると、プロセスがforkされ、その接続が処理されます。私が最終的にできることを望むのは、これらのコマンドを実行してソケットやリレーや情報を元に戻すという、インバウンドのPHP接続を受け入れることです。これまで私はPerlのスクリプトクライアントで100%動作させることができましたが、PHPの場合は100%動作しません。PHPからPerlソケットへの通信
[代わりに、ここではテキストの穴の壁を貼り付けるのは、実際の送信と受信セクションである。]
print "Binding to port ...\n";
$server = IO::Socket::INET->new(
Listen => 1,
LocalAddr => $_server,
LocalPort => $_port,
Proto => 'tcp',
Reuse => 1, Type => SOCK_STREAM) || die "Cant bind :[email protected]\n";
$proccess = fork();
if ($proccess) {
kill(0);
}
else {
while(1) {
while ($client = $server->accept()) {
$client->autoflush(1);
$con_handle = fork();
if ($con_handle) {
print "Child Spawned [$con_handle]\n";
}else{
while (defined($line = <$client>)) {
$command = `$line`;
print $client $command;
}
exit(0);
}
}
}
私は、これはローカルとリモートの両方でperlの書かれたクライアントで正常に動作しますが、動作しません言ったようにPHPが100%の場合、サーバーがコマンドを受け取り、それを送り返すことができない、またはサーバーがコマンドを受け取ることができますが、クライアントが応答を読み取れないという事実は、100%を意味します。
ここで私が最もよく働いているクライアント[php]があります。ここで
$handle = fsockopen("tcp://xx.xx.xx.xx",1234);
fwrite($handle,"ls");
echo fread($handle);
fclose($handle);
それが必要な場合、私は全体のサーバを投稿することができますことができます場合は作業のperlクライアント
#!/usr/bin/perl -w
use strict;
use IO::Socket;
my ($host, $port, $kidpid, $handle, $line);
unless (@ARGV == 2) { die "usage: $0 host port" }
($host, $port) = @ARGV;
# create a tcp connection to the specified host and port
$handle = IO::Socket::INET->new(Proto => "tcp",
PeerAddr => $host,
PeerPort => $port)
or die "can't connect to port $port on $host: $!";
$handle->autoflush(1); # so output gets there right away
print STDERR "[Connected to $host:$port]\n";
# split the program into two processes, identical twins
die "can't fork: $!" unless defined($kidpid = fork());
# the if{} block runs only in the parent process
if ($kidpid) {
# copy the socket to standard output
while (defined ($line = <$handle>)) {
print STDOUT $line;
}
kill("TERM", $kidpid); # send SIGTERM to child
}
# the else{} block runs only in the child process
else {
# copy standard input to the socket
while (defined ($line = <STDIN>)) {
print $handle $line;
}
}
です。
ワウ。本当にNet :: Serverを試すか、AnyEvent :: Socket :: tcp_serverを使ってみてください。それを手動で実装することは、あなたの時間を大いに浪費していました...そしてそれはうまく動作しません。 – jrockway
おそらく、サーバーでエラーを検出し、読み取りまたは書き込みでエラーをログに記録し、そのエラーが問題の診断に役立つかどうかを確認できます。なぜあなたのperlクライアントはforkしていますが、あなたのPHPクライアントはありませんか? – ysth
ちょっと混乱しているように見えるので、私は、Pro :: NetとServerを見ていきます。 perlのクライアントフォークは、それがその方法で動作していたかどうかをすぐに確認するためにネットを引っ張ったときの方法だったからです。 – RyanM