2010-05-10 61 views
2

我在perl中创建了一个向客户端发送消息或命令的服务器。我可以发送命令,但是当我在我创建的服务器上提示输入命令时,如果按'输入',服务器就会混乱起来。这是为什么发生?为什么当我按'enter'时,我的perl服务器停止工作?

这里是我的代码部分:

打印 “\ nConnection从IP地址$ peer_address收到端口$ peer_port”; $ closed_message =“\ n \ t终止客户端会话...”;

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

if'statement is better written if if($ send_data =〜/^\ s * e \ s * $/i){...}' – 2010-05-10 20:09:29

+1

什么是“停止工作”的技术描述和“乱成一团”? :) – DVK 2010-05-10 20:51:52

+0

谢谢Eric的评论。和DVK,它停止工作,因为“命令:”是在一个while循环,这意味着它应该只停止要求输入和终止程序,如果我按两次“e”(一个关闭客户端,另一个关闭服务器),但是,如果我在提示处按Enter键,提示会转到下一行,并且不允许我键入输入。 – David 2010-05-11 01:13:05

回答

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所评论的,我们实际上并不知道你的症状,从你的描述中很难猜出发生了什么。但是,它确实像我过去一直被咬的问题。

+0

谢谢!它非常完美! – David 2010-05-11 21:00:14

+1

@大卫,我很高兴它的工作。也许你可以奖励我,并选择正确的答案? :) – pilcrow 2010-05-11 21:30:16

+1

@pilcrow - 对我赞不绝口。 – 2010-05-11 23:52:50

相关问题