2010-08-25 7 views
7

मैं अमान्य बंदरगाह का उपयोग कर कुछ होस्ट से कनेक्ट करने का प्रयास कर रहा हूं, और मैं एक्स सेकंड के बाद टाइमआउट प्राप्त करना चाहता हूं। उसको कैसे करे ?पर्ल: एक्सओ के बाद आईओ :: सॉकेट :: आईएनईटी टाइमआउट कैसे प्राप्त करें?

मेरे कोड:

$sock = new IO::Socket::INET(
        PeerAddr => $_[0], 
    PeerPort => $_[1], 
    Proto => 'tcp', 
    Timeout => 2 
    ); 

उत्तर

17

आप कोड आप देखेंगे चेक करते हैं (मैं इसे अपने उबंटू 10.04 से नकल):

 my $timeout = ${*$sock}{'io_socket_timeout'}; 
#  my $before = time() if $timeout; 

     undef [email protected]; 
     if ($sock->connect(pack_sockaddr_in($rport, $raddr))) { 
#   ${*$sock}{'io_socket_timeout'} = $timeout; 
      return $sock; 
     } 

     return _error($sock, $!, [email protected] || "Timeout") 
      unless @raddr; 

#  if ($timeout) { 
#   my $new_timeout = $timeout - (time() - $before); 
#   return _error($sock, 
#       (exists(&Errno::ETIMEDOUT) ? Errno::ETIMEDOUT() : $EINVAL), 
#       "Timeout") if $new_timeout <= 0; 
#   ${*$sock}{'io_socket_timeout'} = $new_timeout; 
#  } 

जाहिर टाइमआउट सामान ताकि बाहर टिप्पणी की है expleins इसे नजरअंदाज क्यों किया जाता है।

मुझे 2003 से post डेटिंग मिली जहां इसकी चर्चा हुई। (नीचे) एक सुझाव यह एक eval ब्लॉक जो एक अलार्म संकेत द्वारा समाप्त हो जाता है में सॉकेट खोलने के लिए किया गया था:

eval { 
    local $SIG{ALRM} = sub { die 'Timed Out'; }; 
    alarm 3; 
    my $sock = IO::Socket::INET->new( 
    PeerAddr => inet_ntoa(gethostbyname($host)), 
    PeerPort => 'whois', 
    Proto => 'tcp', 
    ## timeout => , 
); 
    $sock->autoflush; 
    print $sock "$qry\015\012"; 
    undef $/; $data = <$sock>; $/ = "\n"; 
    alarm 0; 
}; 
alarm 0; # race condition protection 
return "Error: timeout." if ([email protected] && [email protected] =~ /Timed Out/); 
return "Error: Eval corrupted: [email protected]" if [email protected]; 

नहीं बहुत सुंदर है, लेकिन अगर यह काम करता है ...

के एक साथ सत्यापित करें धीमे सर्वर और अधीर ग्राहक:

# Impatient Client 
use IO::Socket::INET; 

$sock = new IO::Socket::INET(
    PeerAddr => "localhost", 
    PeerPort => "10007", 
    Proto => 'tcp', 
    Timeout => 2, 
    ); 

print <$sock>; 

close($sock); 


# SlowServer 
use IO::Socket::INET; 

$sock = new IO::Socket::INET(
    LocalAddr => "localhost", 
    LocalPort => "10007", 
    Proto => 'tcp', 
    Listen => 1, 
    Reuse => 1, 
    ); 

$newsock = $sock->accept(); 
sleep 5; 

#while (<$newsock>) { 
# print $_; 
#} 
print $newsock "Some Stuff"; 
close($newsock); 
close($sock); 

अगर हम चलाने इस:

[email protected]:~/playpen$ perl server.pl& 
[1] 9130 
[email protected]:~/playpen$ time perl test.pl 
Some Stuff[1]+ Done     perl server.pl 

real 0m5.039s 
user 0m0.050s 
sys  0m0.030s 

तो यह igno 2 सेकंड टाइमआउट res और पूरे 5 सेकंड के लिए चलाता है।

अब अन्य अधीर ग्राहक:

use IO::Socket::INET; 
eval { 
    local $SIG{ALRM} = sub { die 'Timed Out'; }; 
    alarm 2; 
    $sock = new IO::Socket::INET(
    PeerAddr => "localhost", 
    PeerPort => "10007", 
    Proto => 'tcp', 
    Timeout => 2, 
    ); 

    print <$sock>; 

    close($sock); 
    alarm 0; 
}; 
alarm 0; # race condition protection 
print "Error: timeout." if ([email protected] && [email protected] =~ /Timed Out/); 
print "Error: Eval corrupted: [email protected]" if [email protected]; 

~

और इसे चालू:

[email protected]:~/playpen$ perl server.pl& 
[1] 9175 
[email protected]:~/playpen$ time perl test2.pl 
Error: timeout.Error: Eval corrupted: Timed Out at test2.pl line 3. 

real 0m2.040s 
user 0m0.020s 
sys   0m0.010s 

हां, इस उम्मीद के रूप में 2 सेकंड के बाद टाइमआउट।

+1

'टाइमआउट' विशेषता को अनदेखा नहीं किया जाता है, लेकिन इसका उपयोग 'आईओ :: सॉकेट 'के निर्माता में किया जाता है, न कि' आईओ :: सॉकेट :: आईएनईटी '। हालांकि यह एक अच्छा कामकाज है, और विंडोज़ के लिए ऐसा कुछ जरूरी है। – mob

+0

यह सच है, लेकिन इसका उपयोग आईओ :: सॉकेट :: आईएनईटी के कॉन्फ़िगर उप में टिप्पणी की गई है। AFAICS यह सेट है, लेकिन कभी भी आईएनईटी में उपयोग नहीं किया जाता है। –

+0

धन्यवाद, यह मेरे लिए काम किया। लेकिन, उस हिस्से को स्रोत में क्यों टिप्पणी की जाती है? – code2be

संबंधित मुद्दे