2011-08-19 160 views
1

我想使用非阻塞套接字连接,但找不到任何示例来理解主要想法。 我需要客户端什么不会阻止程序执行时,它将连接到服务器。 现在我有以下代码: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; 
} 

当超时过期时关闭套接字!

+0

http://www.lowtek.com/sockets/select.html基本上解释了这一点。你不在乎它是用于C而不是Perl;原则是一样的。 – tripleee

+0

这个例子显示了服务器端,据我所知它不关心超时。过期后,套接字刚刚关闭。我需要客户端,我需要知道什么时候关闭。 – Shura

回答

1

在套接字的上下文中,“阻塞”与套接字上的读/写操作有关,而不是连接。你有兴趣在设置插座连接上超时,您可以用通常在IO::Socket构造一个

Timeout => $max_seconds_to_wait 

参数做。

+0

如果我在new()中添加'Timeout',它会在程序过期时停止运行。现在,没有超时,它正是我所需要的,new()立即返回。我测试过了。但是我需要知道什么时候超时。 – Shura