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

还东国的博客

行之苟有恒,久久自芬芳

 
 
 

日志

 
 

C#网络编程--重连和心跳的一些具体的细节  

2014-12-04 22:10:49|  分类: 网络服务编程技术 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

C#网络编程--重连和心跳的一些具体的细节

写好的网络通信部分测试的时候儿出现了一些问题,客户端重连的成功的概论大约一半左右,而且听使用的人说重连会连续进行。当时也没引起注意。把核心的部分重新写了一个测试例程,竟然发现了很多的问题。

第一个就是心跳,在心跳的处理过程中,服务端没有什么问题,主要是客户端,因为一旦心跳越界,就会产生自动重连,可是在这里竟然忘记了在重连开始后把心跳清零,而重连的动作是在一个线程中,结果就造成,时间越长,启动的重连线程越多,最终无法控制或者死机,真是无语。以后得更加详细的测试一下自己的程序再交到别人手上。

当然,使用者也发现了这个问题,增加了一个判断属性,如果正在重连就不再启动新线程了,但是这个是治标不治本,还是从根本上解决问题好。

另外还有一个需要说明的就是这里没有在收到服务端的心跳时直接清零,而是做了一个减减(--)动作,在网络环境差时可能会引起较多的重连,但这也不伤大碍,个人觉得反而更能有效的处理一些潜在的异常。

第二个是在重连启动后,报“现在已经正在使用此 SocketAsyncEventArgs 实例进行异步套接字操作”(An asynchronous socket operation is already in progress using this SocketAsyncEventArgs instance),很明显,这个是因为重新连接时SocketAsyncEventArgs此异步套接字操作正在使用,因为这个异步套接字有一个明确的说明:只能是接收、发送和接受等单独的状态,不能同时有两种状态。解决这种方法使用了每次创建新的操作:

            try

            {

                this._socketClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

                this._recvEventArgs = new SocketAsyncEventArgs();

 

这种操作自然有它的不足之处,比如套接操作的资源是有限的,而且操作内存设置是非常耗费资源的,但这里一个是重连毕竟是小概率的事件,另外一个这个是连接操作,还没有涉及到内存的操作设置。

第三个是心跳的定时器,在测试过程中,测试了几次忽然发现了一个问题,客户端的心跳好像不是一分钟一次,好像是三次,而服务端则稳定的每分钟输出一次,这个可是奇怪了,用得是一种方法,甚至名字都是一样的。

后来细看下,才发现,每次重新连接都会创建一个新的定时器,无语。就这。。。真没办法。太大意了。改,先是增加判断,后来觉得不好,直接放到初始化中去了,生成类就自动创建一个,然后再不创建,也不回收。这样也解决了另外一个小问题,如果服务启动后没有成功,就不创建定时器,然后无法自动重新连接的问题。

第四是发现服务端有人增加了e.SocketError== SocketError.OperationAborted这个判断。这个判断一般来说如果在启动了异步服务时进行序列化的操作会出现这种问题。但这个是在Net2.0中,经过测试确实有这种现象。 但是在3.5中测试发现没有这种现象(这里的版本不是单纯的Netframework的版本号而是指用了相应版本中的异步网络通信。)所以这个注释掉,并加以说明。

而且在后来的查看代码和测试过程中发现,基本都是在Accept过程中出现这个问题,而上面的代码加在了OnRecv里面。所以这个用处基本是没有的。即使真出现错误,最坏得结果就是把这个客户端删除掉。

第五就是重连过程中线程控制的事件问题,因为在连接成功地做了一个Set动作,导致可能第一次重新连接会只能连接一次,然后直接退出。同事在前面增加了一个Reset的动作。这个值得商榷,更好的方法是控制住Set,当然直接用Reset是一个懒人的解决方法,也不失一种经济实惠的方法。

还是要相当关注细节。

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

历史上的今天

在LOFTER的更多文章

评论

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

页脚

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