Perl无阻塞套接字
问题描述:
我想使用非阻塞套接字连接,但找不到任何示例来理解主要想法。 我需要客户端什么不会阻止程序执行时,它将连接到服务器。 现在我有以下代码:Perl无阻塞套接字
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->连接()返回true,我可以做一些事情。但如何检查套接字超时?如果它无法连接,并超时关闭,我无法检查!我该怎么做?
加了: 哦,我明白了! 一块代码
if(!sysread($child, $buf, 256))
{
$SELECT->remove($child);
next;
}
当超时过期时关闭套接字!
答
在套接字的上下文中,“阻塞”与套接字上的读/写操作有关,而不是连接。你有兴趣在设置插座连接上超时,您可以用通常在IO::Socket
构造一个
Timeout => $max_seconds_to_wait
参数做。
+0
如果我在new()中添加'Timeout',它会在程序过期时停止运行。现在,没有超时,它正是我所需要的,new()立即返回。我测试过了。但是我需要知道什么时候超时。 – Shura
http://www.lowtek.com/sockets/select.html基本上解释了这一点。你不在乎它是用于C而不是Perl;原则是一样的。 – tripleee
这个例子显示了服务器端,据我所知它不关心超时。过期后,套接字刚刚关闭。我需要客户端,我需要知道什么时候关闭。 – Shura