2009-06-14 8 views
4

これまで、バックグラウンドで常時稼動する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; 
    } 
} 

です。

+4

ワウ。本当にNet :: Serverを試すか、AnyEvent :: Socket :: tcp_serverを使ってみてください。それを手動で実装することは、あなたの時間を大いに浪費していました...そしてそれはうまく動作しません。 – jrockway

+0

おそらく、サーバーでエラーを検出し、読み取りまたは書き込みでエラーをログに記録し、そのエラーが問題の診断に役立つかどうかを確認できます。なぜあなたのperlクライアントはforkしていますが、あなたのPHPクライアントはありませんか? – ysth

+0

ちょっと混乱しているように見えるので、私は、Pro :: NetとServerを見ていきます。 perlのクライアントフォークは、それがその方法で動作していたかどうかをすぐに確認するためにネットを引っ張ったときの方法だったからです。 – RyanM

答えて

2

サーバーはクライアントに回線を送信することを想定しています。しかし、あなたのPHPクライアントは2文字 "ls"だけを送信しています。これは、サーバーがクライアントが改行を送信するのを待つことを意味します。

編集:

  1. あなたのPerl(サーバー)のコードは、行指向のプロトコルを使用しています。あなたのPHPコードはそうではありません。両方の通信方法を混在させるべきではありません。
  2. Perlクライアントは、ライン指向のプロトコルを使用します。
  3. あなたのPHPコードはfgets()で、fread()でないはずです。
  4. サーバーでは、親プロセスはクライアントへのソケットを開いたままにします。そのため、子プロセスが終了するときにソケットが閉じられないため、別のクライアントがサーバーに接続するまでクライアントがEOFを認識しないことが考えられます。
+0

while(defined($ line = <$client>)){ print "Running Command"; ##この点を通り過ぎますか? $ command = '$ line'; print $ command; 「返信を送信しています。 $ client $コマンドまたはdie($!); "返信を送信しました"; } 「印刷マーカ」を追加するとどのように表示されるのですか?吊るしたり「待っている」ことなく返信されたり、他の人をスキップして移動しているだけですか? – RyanM

+0

それは修辞的な質問でしたか? – innaM

+0

ここでは、おそらくバッファリングがあります。 –

関連する問題