【发布时间】:2011-08-19 14:30:57
【问题描述】:
我想使用非阻塞套接字连接,但找不到任何示例来理解主要思想。 我需要客户端在连接到服务器时不会阻止程序执行。 现在我有以下代码:
use IO::Socket;
use IO::Select;
use strict;
$|=1;
my $host="10.0.0.12";
my $SELECT = new IO::Select;
print "Connecting...";
my $sock=new IO::Socket::INET (
PeerAddr => $host,
PeerPort => 3128,
Proto => 'tcp',
Blocking => 0);
if(!$sock)
{
print "Could not create socket: $!n";
}
#print "ok\n";
$SELECT->add($sock);
my $buf;
while (1){
if($sock and $sock->connected())
{
print "ok\n";
}
while (my @ready=$SELECT->can_read(0.5))
{
foreach my $child (@ready)
{
if(!sysread($child, $buf, 256))
{
$SELECT->remove($child);
next;
}
}
}
sleep 1;
}
当套接字连接时,$sock->connected() 返回 true,我可以做点什么。但是如何检查套接字是否超时?如果它无法连接并因超时而关闭,我无法检查!我该怎么做?
添加: 我懂了! 一段代码
if(!sysread($child, $buf, 256))
{
$SELECT->remove($child);
next;
}
超时后关闭套接字!
【问题讨论】:
-
lowtek.com/sockets/select.html 基本上解释了这一点。你不在乎它是为 C 而不是 Perl;原理是一样的。
-
该示例显示了服务器端,据我所知,它不关心超时。在它过期后,套接字就会关闭。我需要客户端,我需要知道它何时关闭。