4

我在 Perl 服务器中使用套接字时遇到了一点麻烦。

你怎么知道一个(非阻塞的)客户端刚刚断开连接?在C中,我习惯做

if (recv(sock, buff, size, flags) == 0) {
    printf("Client disconnected\n";
}

或 python 或其他语言中的等价物:recv如果没有可用数据,则返回 -1,如果客户端退出,则返回 0,如果可以读取数据,则返回正数。

但是 perlrecv不是这样工作的,并且 using$data = <$sock>似乎没有任何可能知道。

有没有(简单的)可能性?

4

1 回答 1

1

你必须看看perldoc perlioand perldoc IO::Socket

#!/usr/bin/perl -w
use IO::Socket;

有很多方法可以与非阻塞 IO 组合,从PIPE信号到recv您可以使用(取决于您在做什么):

return "Socket is closed" unless $sock->connected;

这就是我控制许多套接字为它们服务的方式select。当套接字关闭时,我必须将它们从列表中删除(没有别的,好像断开连接,套接字不再存在,因此无需关闭它们):

unless (eval {$group{$grp}->{'socket'}->connected}) {
    delete $group{$grp}->{'socket'};
    return 0;
};

eval可以防止对断开连接的套接字进行错误尝试,这将导致脚本以套接字 io 错误结束。

希望这可以帮助!

于 2012-12-27T22:59:12.977 回答