注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

还东国的博客

行之苟有恒,久久自芬芳

 
 
 

日志

 
 

Select客户端重连的总结  

2015-01-22 11:52:39|  分类: 网络服务编程技术 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

Select客户端重连的总结

把修改好的网络客户端程序测试了一下,发现了诸多的问题。特别是一些问题,简直匪夷所思,记下来,供参考。

最典型的一个,先说,由于是在虚拟里测试,而这个虚拟机是从另外一台机器上拷贝过来的,结果就是两个虚拟机有一样的IP地址,但是他们也不报冲突。一开始测试了几下挺好,然后就打另外一台机器上修改,准备提交。

这时候儿回来准备再进行一下强度测试,好事来了,程序连接上服务端后迅速退出,但是这里也没有什么问题。只是不断的报如下的错误:

Connection reset by peer with errno: 104

Transport endpoint is not connected with errno: 107

Program received signal SIGSEGV, Segmentation fault

程序然后崩溃。利用转储得到core文件,用gdb test(程序名) core(转储文件名)打开,用

Where来查看,总是报回调函数错误,行数一点儿都不准确,注释了,则没有了。始终是找不到所以然。

有一个现象,虚拟重新恢复到原来的镜像,一开始是好的,但是一旦同步网络成功,就不行了。利用tcpdump来监听(注意要使用ROOT权限:sudo tcpdump tcp port 9999),也看不出个所以,直到最后,在网上查Connection reset by peer with errno: 104这个错误时,有人在论坛上回贴,是因为两台虚拟机的IP地址一样造成的,于是赶紧看自己的打开的两台虚拟机,果然一样,无语啊。关了一台,果然好了。这真是无语。

在程序的运行过程中出现socket.error: [Errno 9] Bad file descriptor,一般原因是网络SOCKET已经被关闭,但是另外的线程或者循环仍然再SendRecv,就会出现这个问题。

在客户端崩溃后或者调试时会报下面这个错误:

Program received signal SIGPIPE, Broken pipe

这个信号表明就是你不断的向一个无效的或者说已经被关闭(服务端或者客户端)的SOCKET发送数据,就会引起这个错误。正常的方法是:

struct sigaction sa;

sa.sa_handler = SIG_IGN;

sigaction( SIGPIPE, &sa, 0 );

或者自定义:

Void owner_handler(int msg)

{

}

struct sigaction sa;

sa.sa_handler = owner_handler;

sigaction( SIGPIPE, &sa, 0 );

但是,悲剧也是从这里来的。下面自定义的方法,仍然会引起程序的崩溃和转储。改回了上面的方法就好了。看来还是得忽略啊,不过不知道忽略后有没有什么意外的后果。只能坐等了。

其实,为了尽量避免前面对关闭的SOCKET进行发送,(接收一般只有在接收不到才会引起心跳的重连),在重连前做一个处理,禁止在重连开始后发送数据,并且设置线程退出。

以前经常看进程的ID或者说进程有几个线程,可是这次又忘记了,写下来:

Ps –ef |grep 程序名字

Ps –xH | grep ID

利用前者可以找到程序的ID,后者利用ID查看有几个线程运行。

整体上来说:

操作SOCKET重连有两种方式:

1、  直接在SOCKET上重启。

2、  SOCKET封装后重新创建。

从感觉上可能前者更精练一些,但需要处理的异常比较多。后者就方便了不少。所以还是倾向于使用第二种方法。

无论哪种方法,如果直接在原来的线程上操作(当然这种情况第一种多),那么数据的接收总会多少有一些问题,如果是每次新建立一个接收线程,则这种问题出现的机率几乎为0,目前看来还是SOCKET的支持在起作用。

初步总结,以咨为记。

  评论这张
 
阅读(342)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017