recv函数接收数据

RLib RLib 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区

没办法,因为数据是未知大小的,使用recv函数接收数据时,可能收不完整,总不可能设置一个超大缓冲区吧?
所以,按照自己的想法改造了下,问题解决了,但又感觉无论是代码还是效率都很鸡肋,怎么办?
大大们帮忙看看吧。。。。。。。。。。。





//分块接收不定长数据
int BlockSize = 1,BufferSize = BlockSize; //块大小,初始缓冲区大小
int thisRecv = 0,allRecv = 0; //本次接收长度,总已接收长度
LPSTR Buffer = new CHAR[BlockSize]; //接收缓冲区
LPSTR Buffer_TempCpy=Buffer; //接收缓冲区的指针临时副本
while(true)
{
thisRecv=recv(s,Buffer+allRecv,BlockSize,0);
//相应处理
if(thisRecv<=0) //接收0长度或者出错
{
if(thisRecv==SOCKET_ERROR) //异常
{
Err();
delete[] Buffer;
return NULL;
}
//接收完成,哈
break;
}
else if (thisRecv<BlockSize) //一次没有接收完指定分块大小
{
BlockSize-=thisRecv;//为了继续接收剩余,藐视没有用?
}
allRecv+=thisRecv; //更新已接收长度
if (allRecv==BufferSize) //缓冲区存满了
{
//开辟更多空间,貌似会产生内存碎片?
Buffer=new CHAR[allRecv+BlockSize];
memcpy_s(Buffer,allRecv,Buffer_TempCpy,allRecv); //复制已接收数据
delete[] Buffer_TempCpy; //删除旧数据
BufferSize+=BlockSize; //更新缓冲区大小
Buffer_TempCpy=Buffer;
}
}
...全文
评论 9
收藏 已收藏
分享
返回顶部
RLib
C++ 语言 65,214 成员 250,514 内容