Сокет Perl закрывается после выполнения команды - PullRequest
1 голос
/ 30 ноября 2011

Это простой сервер сокетов Perl.Он прослушивает команды для данного порта и выполняет яблочный скрипт, если команда «play».Есть две проблемы с кодом ниже.

  1. После выполнения команды play и клиент, и сервер закрываются.(Я хочу, чтобы сервер продолжал прислушиваться к командам, будь то «воспроизведение» или иным образом)
  2. Сокеты не отсоединяются.(Мне нужно менять номер порта каждый раз, когда я его повторно использую)

Я использую Terminal на mac для запуска сценария perl и telnet через терминал на другом mac для его запуска.

#!/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; 
    }

Ответы [ 2 ]

4 голосов
/ 30 ноября 2011

Вы используете exec. От perldoc -f exec

Функция exec выполняет системную команду и никогда не возвращает ; использование система вместо exec, если вы хотите, чтобы он вернулся. Не получается и возвращается false только если команда не существует и выполняется напрямую вместо командной оболочки вашей системы (см. ниже).

Поскольку распространенной ошибкой является использование exec вместо системы, Perl предупреждает Вы, если есть следующее утверждение, которое не умереть, предупредить или выйти (если установлен -w - но вы всегда так делаете, верно?). Если вы действительно хотите следуйте за исполнением с другим утверждением, вы можете использовать один из этих стили, чтобы избежать предупреждения:

Это в основном означает, что ваш сокет закрывается, потому что скрипт perl завершается. Я предполагаю, что это оставляет порты заблокированными, потому что сокет никогда не закрывается явно или неявно.

1 голос
/ 30 ноября 2011

от perldoc -f exec

Функция "exec" выполняет системную команду и никогда не возвращает ; используйте «system» вместо «exec», если хотите, чтобы он возвращался.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...