2011-11-30 8 views
1

シンプルなPerlソケットサーバーです。指定されたポート上のコマンドを待ち受け、コマンドが '再生'の場合は、リンスクリプトを実行します。以下のコードには2つの問題があります。コマンド実行後のPerlソケットのクローズ

  1. 「再生」コマンドが実行されると、クライアントとサーバーの両方が閉じられます。 (私は、サーバーがコマンドを聞き続ける、それが「再生」されているかどうかなど)
  2. ソケットはバインド解除されません。 (私はそれを再利用するたびにポート番号を変更する必要があります)

私は、perlスクリプトを実行するために、ターミナルを使っています。

#!/usr/bin/perl -w 
use warnings; 
use IO::Socket; 
use Net::hostent; 

$PORT = 8000; 

    $server = IO::Socket::INET->new(Proto  => 'tcp', 
            LocalPort => $PORT, 
            Listen => 5, 
            Reuse  => 1) or die "can't setup server" unless $server; 

    print "SERVER Waiting on port $PORT\n"; 

    while ($client = $server->accept()) { 
     $client->autoflush(1); 
     print $client "Command:\r\n"; 

     while (<$client>) { 
      if (/play/i) { 
       exec("osascript '/Users/user/Desktop/play.app'"); 
      } else { 
       print $client "invalid command\r\n"; 
      } 
     } continue { 
         print $client "Command: "; 
     } close $client; 
    } 

答えて

4

execを使用しています。 perldoc -f exec

からexec関数は、システムのコマンドを実行し、は決して返しません。それを返すには、execの代わりに システムを使用してください。コマンドが存在せず、システムのコマンドシェル(下記参照)ではなく直接 が実行された場合にのみ失敗し、 falseを返します。

システムの代わりにexecを使用するのはよくある間違いなので、Perlはdie、警告、または終了しない次の文がある場合、 に警告します (-wが設定されている場合、 、 右?)。あなたは本当に にしたい場合は、いくつかの他の文とのexecに従って、あなたは警告を回避するために、これらの スタイルのいずれかを使用することができます。

perlスクリプトが終了するので、これは基本的に、あなたのソケットが閉じていることを意味します。ソケットが明示的または暗黙的に閉じられていないので、これはポートをブロックしたままにしておくと仮定します。

+0

execをシステムに置き換えて正常に動作します。しかし、私は同じポート上でサーバを2度開くことができません。使用後/使用前にソケットのバインドを解除する方法はありますか? – rom

+0

@rom perlはプロセスの終了を待ってからスクリプトを続行するので、複数のプロセスを実行することはできません。 – TLP

+0

@romああ、あなたのコメントを編集しました...まあ、ドキュメントをチェックしなければなりません。それはあなたのスクリプトをどのように終了するかによって決まります。私は疑いがあります。 – TLP

1

perldoc -f exec

から「実行」機能は、システムコマンドを実行し、決してを返します。それを返すには、 "exec"の代わりに "system"を使います。

関連する問題