非阻塞下,recv获取的长度不对,如何实现获取当前能够获取的长度?

lyvvv 2010-03-10 01:29:13
非阻塞模式下,主机端调用recv时获取的长度不是client发送的长度,包的长度是8k字节,调用recv有时能获取到8k,有时只能获取3k.

我的想法是先判断当前缓冲区的大小,再调用recv,但是怎么获取 当前 缓冲区的长度?
...全文
279 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhou1xp 2010-03-10
  • 打赏
  • 举报
回复
呵呵,这个一个长度而已,楼主自己应该会自己处理吧,发一个结构体过去就行了
bragi523 2010-03-10
  • 打赏
  • 举报
回复
还是要规范一点好啊
先发个长度过去,然后循环接收就好了
Practise_Think 2010-03-10
  • 打赏
  • 举报
回复
一直收,收到你想要的长度就返回好了,而不要指望recv能每次返回你指定的长度
grany 2010-03-10
  • 打赏
  • 举报
回复
如果是用TCP收发,那收到的可能只是数据流的一部分,即使缓冲区没有满。TCP是流的协议,在发送端把10K的数据分100次发送和1次发完理论上没有区别。所以你必须使用循环来接收,直到你收到的数据大小和你想的一样大。如果不想这么麻烦,那就UDP就行了,要么收不到,只要收到了,就一定是你想要的大小。
hurryboylqs 2010-03-10
  • 打赏
  • 举报
回复
先发送长度后发送数据
前4个字节即可
Eleven 2010-03-10
  • 打赏
  • 举报
回复
right,循环接收
zhou1xp 2010-03-10
  • 打赏
  • 举报
回复
int RecvHunk(SOCKET h,char *lpBuf,int nBufLen,int nWillLen)
{
int nRecv = -1 ;
int nRecvAll = 0;

if( h != SOCKET_ERROR && lpBuf != NULL && nBufLen > 0 && nWillLen >0 && nBufLen >= nWillLen )
{
//循环接收,直到数据达到要接收的长度或出错就返回
do {

nRecv = ::recv(h, //已经连接的句柄
lpBuf+nRecvAll,//跳过已经接收的数据
nWillLen-nRecvAll,//计算剩余要接收的数据长度
0);
if( nRecv >0 )
nRecvAll += nRecv;//当前已经接收的长度
else
break;

} while( nRecvAll < nWillLen );
}

return nRecvAll;
}

18,363

社区成员

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

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