シンプルなPerlソケットサーバーです。指定されたポート上のコマンドを待ち受け、コマンドが '再生'の場合は、リンスクリプトを実行します。以下のコードには2つの問題があります。コマンド実行後のPerlソケットのクローズ
- 「再生」コマンドが実行されると、クライアントとサーバーの両方が閉じられます。 (私は、サーバーがコマンドを聞き続ける、それが「再生」されているかどうかなど)
- ソケットはバインド解除されません。 (私はそれを再利用するたびにポート番号を変更する必要があります)
私は、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;
}
execをシステムに置き換えて正常に動作します。しかし、私は同じポート上でサーバを2度開くことができません。使用後/使用前にソケットのバインドを解除する方法はありますか? – rom
@rom perlはプロセスの終了を待ってからスクリプトを続行するので、複数のプロセスを実行することはできません。 – TLP
@romああ、あなたのコメントを編集しました...まあ、ドキュメントをチェックしなければなりません。それはあなたのスクリプトをどのように終了するかによって決まります。私は疑いがあります。 – TLP