【问题标题】:Perl socket closes after executing a commandPerl 套接字在执行命令后关闭
【发布时间】:2011-11-30 21:43:16
【问题描述】:

它是一个简单的 Perl 套接字服务器。它侦听给定端口上的命令,如果命令是“播放”,则执行一个applescript。下面的代码有两个问题。

  1. 执行“播放”命令后,客户端和服务器都将关闭。 (我希望服务器继续监听命令,无论是“播放”还是其他)
  2. 套接字不会解除绑定。 (每次重复使用都必须更改端口号)

我在 Mac 上使用终端来执行 perl 脚本,并通过另一台 Mac 上的终端 telnet 来触发它。

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

【问题讨论】:

    标签: macos perl sockets applescript


    【解决方案1】:

    您正在使用exec。来自perldoc -f exec

    exec函数执行系统命令,永不返回;利用 如果您希望它返回,则 system 而不是 exec。它失败并返回 仅当命令不存在且直接执行时才为 false 而不是通过系统的命令外壳(见下文)。

    由于使用 exec 而不是 system 是一个常见错误,Perl 警告 如果有以下语句不是 die、warn 或 exit (如果设置了 -w ——但你总是这样做,对吧?)。如果你真的想 在 exec 后面加上其他语句,您可以使用其中之一 避免警告的样式:

    这基本上意味着您的套接字关闭,因为 perl 脚本退出了。我认为这会使端口被阻塞,因为套接字永远不会显式或隐式关闭。

    【讨论】:

    • 刚刚将 exec 替换为 system 并且工作正常。但是,我仍然无法在同一端口上重新打开服务器两次。有没有办法在使用后/使用前解除绑定套接字?
    • @rom 请注意,perl 将等待进程完成后再继续执行脚本,因此您将无法运行多个进程。
    • @rom 哦,你编辑了你的评论......好吧,你必须检查文档。这取决于你如何退出你的脚本,我怀疑。
    【解决方案2】:

    来自perldoc -f exec

    “exec”函数执行系统命令并且永不返回;如果您希望它返回,请使用“system”而不是“exec”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-05
      • 1970-01-01
      • 2011-05-05
      • 1970-01-01
      • 2014-02-04
      • 1970-01-01
      相关资源
      最近更新 更多