当我按“输入”时,为什么我的perl服务器停止工作?

时间:2010-05-10 19:56:44

标签: perl

我在perl中创建了一个向客户端发送消息或命令的服务器。我可以很好地发送命令,但是当我在服务器上提示我创建命令时,如果我按下“输入”,服务器就会混乱。为什么会这样?

以下是我的代码的一部分:

print“\ n从端口$ peer_port上的IP地址$ peer_address收到的连接”;     $ closed_message =“\ n \ tTerminated client session ...”;

 while (1)
 {

     print "\nCommand: ";

     $send_data = <STDIN>;
     chop($send_data); 

     if ($send_data eq 'e' or $send_data eq 'E' or $send_data eq ' E' or $send_data eq ' E ' or $send_data eq 'E ' or $send_data eq ' e' or $send_data eq ' e ' or $send_data eq 'e')
        {

        $client_socket->send ($send_data);
        close $client_socket;
        print "$closed_message\n";
        &options;
        }

     else
        {
        $client_socket->send($send_data);
        }

        $client_socket->recv($recieved_data,8000);
        print "\nRecieved: $recieved_data";
}

}

1 个答案:

答案 0 :(得分:3)

您的服务器在对$client_socket->recv(...)的呼叫中阻塞 - 服务器和客户端已经死锁,每个人都在等待对方发言。

尝试将此行放在chop()

之后
next unless length $send_data;  # restart the loop if no command submitted

现在,重新修改你的例子,这就是我推测的事情:

$send_data = <STDIN>;            # $send_data := "\n"
                                 # you just input a blank line with [ENTER]

chop($send_data);                # $send_data := ""

$client_socket->send($send_data) # you send a zero-length buffer
                                 # On my system, this does generate a syscall for
                                 # the sender, but no data is transmitted

$client_socket->recv($buf, 8192) # Hang indefinitely.  Your client application
                                 # received no command, and so it has sent no
                                 # response.

这只是猜测。正如@DVK评论的那样,我们实际上并不知道您的症状,并且从您的描述中很难猜出发生了什么。然而,它确实类似于我过去曾被咬过的问题。