调用recv接收1024字节,为什么需通过循环多次接收,为什么不能一次收完?

wmnmtm 2011-03-20 01:09:39
#define NUM_REQUIRED 1024	//需要读入的数据的大小
#define MAX_SIZE 2048 //输入缓冲区的大小
TCHAR buff[MAX_SIZE]; //输入缓冲区
bool close; //对方关闭了连接
SOCKET sock; //Windows sockets

void ReadData(void)
{
int nTotal = 0; //已经读入缓冲区的字节数
int nRead = 0; //在调用recv时实际读入的字节数
int nLeft = 0; //剩下数据的字节数
int nBytes = 0; //当前已读数据在缓冲区的位置

nLeft = NUM_REQUIRED;

while (nTotal != NUM_REQUIRED) //已经读入缓冲区的字节数不等于需要读入的大小时
{
nRead = recv(sock,&buff[MAX_SIZE-nBytes],nLeft,0);//接收数据
if(SOCKET_ERROR == n_Read)//读操作失败
{
int err=WSAGetLastError();
if(WSAEWOULDBLOCK == err)//接收数据缓冲区不可用
{
continue;//接着读取数据
}
else if (WSAETIMEDOUT == err || WSAENETDOWN == err)//连接已经断开
{
close = TRUE;//函数退出
break;
}
}

if (0 == nRead)
{
close = TRUE;//客户端关闭了连接
break;//函数退出
}

nTotal += nRead;
nLeft -= nRead;
nBytes += nRead;
}
return;
}


缓冲区2048字节,需接收的数据1024字节,代码显示需通过循环多次调用recv函数来接收,那么到底会调用几次呢,是不是对于不同的网卡可能执行次数也不同呢
为什么这1024字节不能一次接收到缓冲区中。

...全文
2103 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
zk0233 2011-03-20
  • 打赏
  • 举报
回复
为了适应不同网速的状况,应该在循环中接收数据,对recv函数的返回值累加,直到累加值=最终要接收的值,再出循环
jwybobo2007 2011-03-20
  • 打赏
  • 举报
回复
tcp是流协议,那自然意味着你发送1024字节,对方不一定一次就recv了1024字节,可能因为网络状况差等情况,收取到的数据小于1024,那么就需要多次recv来得到数据.另外得到recv的返回值,它告诉你到底收到了多少数据
hurryboylqs 2011-03-20
  • 打赏
  • 举报
回复
这是TCP协议的特性造就的
upc_xiaowei 2011-03-20
  • 打赏
  • 举报
回复
你想要用recveive接收1024个数据,实际上并不一定接收到1024个数据,tcp缓冲区有多少个字节就返回多少个,它不是有个返回值吗,否则如果没有足够的数据,这个函数是会阻塞的。
Eleven 2011-03-20
  • 打赏
  • 举报
回复
注意参考recv的返回值~
smwhotjay 2011-03-20
  • 打赏
  • 举报
回复
一次收不完.因为网络还在传送中...
wmnmtm 2011-03-20
  • 打赏
  • 举报
回复 1
如果分几次接收数据,接收到的数据怎么往缓冲区放,看上面的代码,存放的位置好像不对吧。

比如缓冲区为TCHAR buff[MAX_SIZE]; //输入缓冲区
第一次收到500个字节,那么这500个字节是不是该放到&buff[0]-&buff[499],也就是第一次收到的放在缓冲区的开始,第二次收到的500字节放到缓冲区的&buff[500]往后的空间,但是从网卡的缓冲(假设有这个)取到的顺序是怎么样的,代码好像正好和这个假设相反。
fishion 2011-03-20
  • 打赏
  • 举报
回复
不是不能,可能网络状况不好的时候,就要循环接收了,而要调用多少次,就看你的recv接收的数据为1024个字节大小没有

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧