64,662
社区成员
发帖
与我相关
我的任务
分享
没办法,因为数据是未知大小的,使用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;
}
}
int nTotal = 255; // 比如总大小为255字节
char* buf = new char[255 + 1]; // 多分配一个
memset(buf, 0, 255+1);
int Left = 255;
int nRet = 0;
int nCount = 0;
while(Left > 0)
{
nRet = recv(s, buf+nCount, Left, 0);
if(SOCKET_ERROR == nRet)
{
// Error handler...
}
else
{
Left -= nRet;
nCount += nRet;
}
}
// 使用buf
....
// 最后delete buf
delete[] buf;
buf = NULL;