免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2307 | 回复: 3
打印 上一主题 下一主题

AnyEvent::Socket判断连接断开异常 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-04-17 22:17 |只看该作者 |倒序浏览
10可用积分
连接了个python的tcpserver,AnyEvent::Handle在python的tcpserver断开时在on_error和on_eof都无法知道连接被断开了,为啥阿?

论坛徽章:
0
2 [报告]
发表于 2013-04-18 07:56 |只看该作者
贴代码                  

论坛徽章:
0
3 [报告]
发表于 2013-04-18 10:13 |只看该作者
与perl的socket没发现问题,相同代码
  1.     tcp_connect $if_ip,$if_port,
  2.         sub {
  3.             my ($sock)=@_;
  4.             unless ($sock) {
  5.                 $interface->{$if_info}=undef;
  6.                 delete $interface->{$if_info};
  7.                 $log->w_log(5,"[conn_interface] Could not connect to interfaceService $if_ip:$if_port");
  8.                 return;
  9.             }
  10.             my $handle;
  11.             eval {
  12.                 $handle = AnyEvent::Handle->new (
  13.                     fh => $sock,
  14.                     on_read => sub {
  15.                         my $buf = delete $_[0]->{rbuf};
  16.                         if (defined($buf)) {
  17.                             push(@{$interface->{$if_info}->{recv_buf}},$buf);
  18.                             &check_recv_buf("interface",$if_info);
  19.                         }
  20.                     },
  21.                     on_eof => sub {
  22.                         $handle->destroy;
  23.                         undef $interface->{$if_info};
  24.                         delete $interface->{$if_info};
  25.                         $log->w_log(5,"[conn_interface] connection eof:$!");
  26.                     },
  27.                     on_error => sub {
  28.                         $handle->destroy;
  29.                         undef $interface->{$if_info};
  30.                         delete $interface->{$if_info};
  31.                         $log->w_log(5,"[conn_interface] connection error");
  32.                     },
  33.                 );
  34.             };
  35.             unless($handle) {
  36.                 $interface->{$if_info}=undef;
  37.                 delete $interface->{$if_info};
  38.                 $log->w_log(5,"[conn_interface] Create AnyEvent::Handle error!");
  39.                 return;
  40.             }
  41.             $interface->{$if_info}->{status}=1;
  42.             $interface->{$if_info}->{sock} = $sock;
  43.         }, sub {
  44.             5
  45.         };
复制代码

论坛徽章:
0
4 [报告]
发表于 2013-04-20 23:17 |只看该作者
你贴的客户端的代码中我没有看到$cv->send,猜测是你服务器端做$cv->send,但这不符合常理。一般情况下是客户端做$cv->send,服务器端会捕捉到on_eof

你说用Perl的服务器端的话,客户端就可以捕捉到on_eof,猜测是因为你写的Perl服务器端做了$cv->send,这样客户端就可以捕捉到on_eof了

ps.建议用push_read和push_write,“delete $_[0]->{rbuf};”并不好,缺乏灵活性,并不适用于项目中,也就是写简单例子时候用一下
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP