还是要学习一点网络通讯的基本原理
来源:互联网 发布:mac无法写入u盘 编辑:程序博客网 时间:2024/06/04 20:03
总会看到c++新手写网络通讯时,不理解recv()为什么阻塞或不阻塞,TCP数据顺序会不会乱,UDP会不会数据包不完整,都是对TCP/IP协议原理没有基本常识导致的。
我曾看到代码,客户端recv(buf, 31), 实际服务器只会发送4个字节,客户端将永远阻塞,直到服务器主动close()为止。
开始时那个服务器是实现一请求一应答,答应后立即关闭,所以客户端没有事。
后来服务器维护者,感觉要支持一个连接上支持一个或多个请求,就修改成等待客户端自己关闭或网络异常,服务器才关闭socket。这个修改看来是正常的,因为服务器一般写法都是被动关闭的,关闭权在客户端。可是这么一修改,原来那个客户端就阻塞死了,用户莫名其妙。
这里有一个有趣现象:如果服务器维护者不修改,那么那个客户端软件一直是可以正常运行的,但从我们开发者角度来看,明明是一种实现错误,至少是缺陷吧。可是,测试人员黑盒测试是不可能测试出来的,一般测试人员也不会去写代码测试,所以这种问题测试组搞不定。
很多时候,在测试环境里没问题,在真实环境就出现一些古怪的问题,其实问题不古怪。
比如:A通过TCP向B发送1024字节,B采用一次性接收recv(buf, 1024), 测试环境常常每次都是一次收满,包是完整的;在真实环境,A和B在不同地域,之间不知道多少交换机和路由器,那可能就第一次只收到500字节,如果不加判断返回值乱处理,问题就出来了。
这个问题还不止一次看到新手这么干。
- 还是要学习一点网络通讯的基本原理
- Android菜鸟还是当走一点,学一点罢(对基础的学习万不可松懈)
- 跨平台网络通讯要注意的地方
- 关于初学者该选择学习ARM7还是ARM9的一点建议
- 关于创业还是工作的一点感悟
- 考研还是工作?----- 一点自己的看法
- 还是喜欢快乐一点的电视剧
- wince网络通讯的问题
- 关于网络通讯的危险期
- lpc1768的网络通讯
- 一次完整的网络通讯
- liccurl网络通讯的例子
- 简单的Qt网络通讯
- 网络通讯类的逆向
- 完整的网络通讯过程
- 一点学习的感触
- 集群的一点学习
- 学习的一点心得
- 黑马程序员——C#版骑士飞行棋
- Android应用UI设计和用户体验的10个要点
- pthread多线程学习笔记五条件变量2使用
- Linux Shell脚本
- ajax+js+dom实现隔行变色效果
- 还是要学习一点网络通讯的基本原理
- 静态链接库和动态链接库
- C++对话框背景透明处理的问题
- vim编辑器使用
- Android自定义action与permission!!!
- Web操作
- 判断回文数字
- 【软件测试自动化-QTP系列讲座 52】== VBS类的伪构造器模式设计(一) ==
- /etc/environment 和 /etc/profile