2010-05-10 51 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

相關問題