有关recv端数据流分割问题的一点思考

博客讨论了TCP协议中recv端可能遇到的数据流分割问题,强调了send不完全情况的处理,特别是当recv仅接收到部分包头时可能导致的解析错误。博主指出,系统缓冲区与recv请求之间的不匹配也可能造成数据包被截断。解决方案包括使用半包缓冲区来处理未完成的数据,并确保接收缓冲区长度和数据包长度为4的整数倍以减少不完整接收的可能性。
摘要由CSDN通过智能技术生成
       不管阻塞接收还是异步接收,总是绕不开数据流的分割问题。然而不知道什么原因,网上竟然很难找到现成、合用的代码,也许这种问题不值得付诸于代码,或者不太容易写出普遍通用的代码吧,但不论如何,轮到自己,个人觉得还是应该细致的做个总结。


       抛开一些复杂因素,有助于清晰思路,更容易找到解决问题的办法,所以决定从最简单、也相当富有代表性的阻塞套接字开始研究,省略掉一些对所涉问题关系不是很大的代码,保留关键部分,如下:


int i_save_size;//尾巴数据长度
char c_save[2000];//保存上次接收的尾巴数据
char c_recv[2000];//数据接收缓冲区


u_long _stdcall thread_recv(void *arg)
{
... ...


while(TRUE)
{
i_eax=::recv(h,c_recv,2000,0);


if(SOCKET_ERROR==i_eax)
{
::closesocket(h); break;
}


data_patition(c_recv,i_eax,c_save,&i_save_size);//分割数据流
}
return 0;
}


假设数据包格式为:4字节包头+不定长包体,那么我们假设一种情况,recv拷贝到长度2000字节的数据,其中包括两个整包(1500字节,498字节),一个残缺包(2字节),这种情况当然需要做一些处理,处理过程如下:


int data_patition(char *c_data,int i_eax,char *c_save,int *p_save_size)
{
int i_rest=i_eax; char *p_rest=c_data; int i_size;


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值