服务器向客户端发送数据自动中断

客户端在接收Linux服务器的TCP数据时出现假死,原因是客户端处理速度慢导致服务器TCP窗口满,造成数据溢出。解决方案包括:客户端接收数据与处理数据异步化,增加客户端和服务器的缓冲区大小。通过设置SO_RCVBUF和SO_SNDBUF选项,分别将接收和发送缓冲区设为2MB。
摘要由CSDN通过智能技术生成

问题现象:

客户端接收服务器端数据出现假死现象。

环境描述:

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));

数据包中的现象:


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值