perl的socket代码如何写才能避免无限等待?

perl的socket代码如何写才能避免无限等待?

until (
                $socket = IO::Socket::INET->new(PeerAddr => $host,
                        PeerPort => $port,
                        Proto => "tcp",
                        Timeout => 5,
                        Type => SOCK_STREAM)
                        or (!($!{EINTR}) && !($!{ECHILD}) && print "Couldn't connect to $hostport : $@\n")) {}

        if ($socket) {
                print $socket "get\n";
            
                while (<$socket>) {
                        chomp;
                        push(@data, $_);
                }
                close($socket);
        }

现在我的代码是这样的,通常的时候运行的很好,但是,一旦服务器中途宕机,客户端这边就陷入了无限等待中,等服务器恢复后,客户端这边仍然在等待。
从代码上看,问题应该不是出在connect的时候(因为这段代码为连接设置了超时,如果错误是EINTR或ECHILD则重试,直到连接上或出其他错为止)。
那么我怀疑是接下来的发送和接收数据有问题了,可是我不知道正确的写法是什么?


[Copy to clipboard] [ - ]
CODE:
print $socket "get\n";
$socket->shutdown(1);

谢谢你,我加上这一句去试试看,不过可能要下周才能知道结果,因为服务器很长时间才宕机一次。

不过我有疑问,能否给我解释一下,为何客户端这边加了shutdown之后,就能在服务器不响应的时候避免无限等待呢?
好像你的方法不顶用,我现在是这么测试的:
客户端开始后,在服务端按ctrl+z挂起服务器,这个动作应该算很好的模拟了服务器宕机的情形。
这种情况下,加不加$socket->shutdown(1);好像都没区别,客户端照样陷入了无限等待中。


QUOTE:
原帖由 oyd_admin 于 2007-11-12 12:35 发表
until (
                $socket = IO::Socket::INET->new(PeerAddr => $host,
                        PeerPort => $port,
                        Proto => "tcp",
                        Timeout = ...

你可以尝试下去掉下面的if语句。只留连接语句。看看是不是连接导致的。我看好像是由于until导致的死循环。但是如果服务器端好了。应该就不会是继续等待了。你实时看吧。
试了,连接由于设置了超时,不会导致死循环。
我想,是不是应该用alarm为后面的发送/接收都设置超时呀?
不过我见过的socket示例代码都没有用alram设超时的。