2012-07-17 64 views
0

我正在使用以下代碼。我想超時並在20秒後關閉連接,嘗試報警但沒有任何工作。這裏是我的代碼:無法超時

my $socket_resp = IO::Socket::INET->new(Blocking => 0, LocalPort => $comm_port, Proto => 'udp', Timeout => 2); 
    $socket_resp->setsockopt(SO_RCVTIMEO, SO_RCVTIMEO, 10); 
    print "Waiting for Response On Port $comm_port\n"; 
    while (my $recieved_data = $socket_resp->getline()) { 
     chomp($recieved_data); 
     print "$recieved_data\n"; 
     if ($recieved_data =~ m/^done/i) { 
      last; 
     } 
    } 

    $socket_resp->close(); 
+1

你試過了嗎:[如何獲得IO :: Socket :: INET超時後X秒?](http://stackoverflow.com/questions/3570440/perl-how-to-get-iosocketinet-timeout-after-x-seconds) – 2012-07-17 12:28:39

+2

你想要一個總的套接字壽命at最多20秒,或者每個* getline()調用20秒耐心? – pilcrow 2012-07-17 13:23:15

+0

您可能需要[回頭查看您的問題](http://stackoverflow.com/users/1065000/user1065000?tab=questions)和[接受答案](http://stackoverflow.com/faq#howtoask)幫助你。 – simbabque 2012-07-17 14:47:28

回答

0

包裝一下你的整個讀迴路報警,如other question建議將很可能你想要什麼。你不會向我們展示代碼,所以我們不知道你以前的嘗試失敗的原因。

也就是說,SO_RCVTIMEO也可以工作,雖然有點不同。

在這種情況下,您希望阻止而不是非阻塞套接字。你也想setsockopt正確,這就需要SOL_SOCKET和pack()荷蘭國際集團一struct timeval

my $s = IO::Socket::INET->new(Proto => 'udp', ...);   # N.B.: blocking 
$s->setsockopt(SOL_SOCKET, SO_RCVTIMEO, pack('l!l!', 20, 0)); # N.B.: pack() 
while (<$s>) { 
    ... 
} 

現在,上面等待20秒每個底層調用read(),這可能比返回的線的數量多你的申請。也就是說,如果我在一個數據報中發送應用程序"foo\n",然後什麼也不做,你會在20秒後超時。但是,我可能會發送"f",然後等待19秒,"o",然後等待19秒,"o",然後等待19秒,...你會明白這一點。)