加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

perl – 你怎么知道套接字客户端断开连接?

发布时间:2020-12-16 06:13:12 所属栏目:大数据 来源:网络整理
导读:我在Perl服务器中使用套接字时遇到了一些麻烦. 你怎么知道一个(非阻塞)客户端刚刚断开连接? 在C中,我已经习惯了 if (recv(sock,buff,size,flags) == 0) { printf("Client disconnectedn";} 或python或其他语言中的等价物:如果没有可用数据,recv返回-1,如
我在Perl服务器中使用套接字时遇到了一些麻烦.

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

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

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

但perl的recv不能以这种方式工作,并使用$data =< $sock>似乎没有任何可能性知道.

有没有(简单)可能性?

解决方法

你必须看看perldoc perlio和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可以防止对断开连接的套接字进行错误的尝试,这将导致脚本出现套接字错误.

希望这可以帮助!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读