你怎么知道socket客户端断开连接?

时间:2012-12-27 20:48:18

标签: perl sockets

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

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

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

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

但是perl的recv并没有这样做,使用$data = <$sock>似乎没有任何可能的知识。

有没有(简单)可能性?

1 个答案:

答案 0 :(得分:1)

您必须查看perldoc perlioperldoc 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阻止了对断开连接的套接字的错误尝试,该套接字将以套接字错误结束您的脚本。

希望这有帮助!