服务器向客户端发送数据自动中断
2015-08-30 10:38
225 查看
问题现象:
客户端接收服务器端数据出现假死现象。环境描述:
1. 客户端是window程序
2. 服务器端是Linux程序
3. 服务器端程序和客户端程序采用TCP进行通讯
问题分析:
1. 首先,客户端上进行抓包,对其数据包进行分析,发现服务器端发送的数据总是不完全2. 其次,服务器上进行抓包,发现发送一会儿后,发送端的TCP窗口满了,导致数据溢出,发送的数据都是错误的数据包
3. 从服务器上的数据包分析发现,由于客户端处理速度过慢引起
解决问题的方法:
1. 提高客户端接收数据的速度,接收数据和处理数据进行异步处理。接收数据单独一个线程/进程,将接收到的数据直接进行分发到数据处理目标线程/进程;即,消息泵机制2. 增加客户端接收数据的缓冲区
3. 增加服务器端发送数据的缓冲区
缓冲区设置:
//接收缓冲区int nRecvBuf = 2<<20; //设置为2M
setsockopt(s, SOL_SOCKET, SO_RCVBUF, (constchar*)&nRecvBuf, sizeof(int));
//发送缓冲区
int nSendBuf=2<<20; //设置为2M
setsockopt(s, SOL_SOCKET, SO_SNDBUF, (constchar*)&nSendBuf, sizeof(int));
数据包中的现象:
相关文章推荐
- Codeforces Round #318 574B Bear and Three Musketeers(模拟)
- 开发者应当敬畏和尊重技术
- 一起talk C栗子吧(第四十四回:C语言实例--深度优先遍历一)
- 验证身份证是否合法算法
- context:component-scan>使用说明
- C++中指针和引用的区别
- iOS开源大全
- Java记录 -16- 抽象类及接口
- Scala深入浅出实战初级入门经典视频课程
- SequoiaDB入门教程
- CodeForces 443A Anton and Letters
- 【财富人生】启蒙之旅01
- 程序员必读书单 1.0
- gangs
- Bestcoder #53
- 基于Hadoop的大数据分析实战-Hadoop部署与实践视频课程
- 优化Eclipse启动和运行速度
- 树的非递归遍历:一种很好的算法
- Android基础知识巩固:关于PendingIntent和广播
- RSA密钥的生成与配置