आप कोड आप देखेंगे चेक करते हैं (मैं इसे अपने उबंटू 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 सेकंड के बाद टाइमआउट।
'टाइमआउट' विशेषता को अनदेखा नहीं किया जाता है, लेकिन इसका उपयोग 'आईओ :: सॉकेट 'के निर्माता में किया जाता है, न कि' आईओ :: सॉकेट :: आईएनईटी '। हालांकि यह एक अच्छा कामकाज है, और विंडोज़ के लिए ऐसा कुछ जरूरी है। – mob
यह सच है, लेकिन इसका उपयोग आईओ :: सॉकेट :: आईएनईटी के कॉन्फ़िगर उप में टिप्पणी की गई है। AFAICS यह सेट है, लेकिन कभी भी आईएनईटी में उपयोग नहीं किया जाता है। –
धन्यवाद, यह मेरे लिए काम किया। लेकिन, उस हिस्से को स्रोत में क्यों टिप्पणी की जाती है? – code2be