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

还东国的博客

行之苟有恒,久久自芬芳

 
 
 

日志

 
 

网络编程的一错误分析  

2011-10-18 11:47:48|  分类: 网络服务编程技术 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

网络编程的一错误分析
今天测试一个小小的网络程序,非常简单,简单不得了的地步,没想到,翻了船,折腾了一个小时,才明白了怎么回事。说正事,为了验证一下昨天看书中说得LINUX下的SELECT模型可以设置成非阻塞,今天来公司看书上WIN下是否可以设置,结果发现,WIN下暂时是不可以的,将超时设置成0反而会成为阻塞的,设置成多少毫秒倒可以立刻返回,什么世道,这LINUX和WIN是不是成天掐架。
然后戏肉来了,找了一个原来的最简单的工程客户端,连接想测试一下,结果悲剧了,竟然收不到数据,SELECT服务端上。找原因开始,一开始认为是数据发的太快,可再快这也是IO操作,CPU对付他应该是绰绰有余啊。加延时,好一些,可一会又不行了,时好时坏,这东西可是人家出书上用的,肯定不会有错,即使不好使,也不可能这样不好使。
折腾了会子,还是不行,换别的,找了一个事件模型的服务端,这个用得一直不错,应该不会有问题,结果发现,大出意外,竟然这个更狠,连收到连接都没有了。下断点,发现程序一连接后直接进入了FD_CLOSE,晕,明白了,不是发得太快了,是关得太快了。
回头查客户端,果不然,程序connect后,立刻send,然后把return 0;在send后增加延时,服务端每次都可以正确的收到数据了,明白了,然后把延时改做一个判断,判断是否正确发送成功,结果服务端也好了,然后再测试select模型,也OK。
然后想是不是这种所谓的事件或者异步(SELECT是异步还是同步看本人其它文章),导致事件的乱序发生呢,是不是同步会好些呢。
换成同步,测试结果发现,仍然是只能接到连接,接不到实际的数据,同样延时或加判断后,可以正确收到。
在实际的应用中,一般极少会出现这种情况,因为一个程序不可能因为一个网络程序通信中止而中止,而且一般也会有正确的异步判断,不会出现这种直接就关闭的现象。但在测试程序中,比如这次,可就没有什么不可以的了,只是,只是,原来怎么就没有发现过捏,真是有意思。
“纸上学来终觉浅,绝知此事要躬行”!
诚不我欺。

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

历史上的今天

在LOFTER的更多文章

评论

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

页脚

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