关于Recv接收数据的数据量

godfly000 2005-05-18 07:18:35
我在另一台机子上用send函数一次发送了11200byte的数据,为什么主机用recv函数一次只接收了0x002238个byte,约为8160或更少,很奇怪。如果只发送5600或较少的数据,是可以正确接受的。我用的是WSAnySelect函数注册的wnd消息FD_READ,而且好像毎次连续收到两次读数据的消息,send内部是分批发送的吗?哪位高手指教一下,万分感谢!!!
...全文
338 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
godfly000 2005-05-22
  • 打赏
  • 举报
回复
经过不懈努力和大家的帮助基本解决了问题,揭帖!
godfly000 2005-05-20
  • 打赏
  • 举报
回复
我的是适时系统,还有其他处理、显示线程,为了提高效率,我传送的数据没有设置边界,只根据读到的数据大小判断是否正确。循环接受,好像会死机,即接受不到那么多数据,我是消息触发接受的,有关系吗?
godfly000 2005-05-20
  • 打赏
  • 举报
回复
我每次发送的也就是11200byte,setsockopt我调用了两次,一次设置缓冲大小,一次让其立即发送(TCP_NODELAY),应该不会粘包吧,而且40s后,接收是正确地。而且记录是45~~~48ms收到一次数据,与发送时间是一致的。就是前面40s不稳定,时间数据都不对,可能是分批发送的,不知道什么原因,能解决吗?
godfly000 2005-05-20
  • 打赏
  • 举报
回复
现在的问题是得到一次读数据消息,即使循环接受也得不到全部数据,而且是刚开始传输时得不到,一分中后会稳定
smzh8 2005-05-20
  • 打赏
  • 举报
回复
这好像是系统限制的发送包大小。限制在一次发送数据包8K左右。
zhengstar 2005-05-20
  • 打赏
  • 举报
回复
微软得tcp协议得接收缓冲区最大默认是8192个字节,在加上TCP协议头,所以你每次recv最到也就接收
8千多个字节,甚至更少
younggle 2005-05-20
  • 打赏
  • 举报
回复
AntonlioX() 说得对,要循环的接受,知道你发送的数据大小与接受到的数据大小相等再处理,不然就会粘包或者掉包,处理就会出错了。
nuaawenlin 2005-05-20
  • 打赏
  • 举报
回复
又关系,如果触发消息之后,由于处理的原因,没有recv的话

那么以后的消息就被阻塞了
MuseIn 2005-05-19
  • 打赏
  • 举报
回复
应该是发送的时间间隔的问题
AntonlioX 2005-05-19
  • 打赏
  • 举报
回复
需要循环调用Receive的 知道你实际接收的字节数== 你本来打算接收的字节数
AntonlioX 2005-05-19
  • 打赏
  • 举报
回复
给你一段代码你就明白了

BOOL MyReceiveData(CSocket *psocket,char *data,DWORD len)
{
DWORD left,idx,ret;
left=len;
idx=0;

while(left>0)
{
ret = psocket->Receive(&data[idx],left,0 );
if( ret == SOCKET_ERROR)
{
return FALSE;
}
left-=ret;
idx+=ret;
}

return (idx==len)?TRUE:FALSE;
}
AntonlioX 2005-05-19
  • 打赏
  • 举报
回复
up
xift_2008 2005-05-19
  • 打赏
  • 举报
回复
我想网络数据包每次发送的小一点应该比较稳定吧
经验值是1500字节吧,包与包之间的时隙也是影响
数据发送稳定性的因素。
redchina 2005-05-19
  • 打赏
  • 举报
回复
tcp一般保证的是可靠的位流传输,如果你传输的是结构数据,也就是说带有消息边界。应该使用setsockopt()使得tcp层立即发送数据,这样在稍微长一点的时间内(比如500ms单位)内发送一次数据就可以保证你接受方接受到的是结构化的数据,如果你本身发送程序间隔很短,比如1ms,这样就会出现粘包。在接受端接受到的仍然不会是结构化的数据,这就需要你解包。~~~~
godfly000 2005-05-19
  • 打赏
  • 举报
回复
我接受数据是用网络事件触发的,知道每次有数据的间隔时间,如前所说,一段时间后才会稳定,间隔短的时间我就不接受
godfly000 2005-05-19
  • 打赏
  • 举报
回复
TCP的窗口是什么意思,不好意思,刚学不太懂,能不能说明白一点?
Wenxy1 2005-05-19
  • 打赏
  • 举报
回复
是不是TCP的窗口设置小了些?
godfly000 2005-05-19
  • 打赏
  • 举报
回复
我用setsockopt函数重新设置了缓冲大小基本上好了,但是不知道为什么开始的时候仍然接受不到那么多数据,大概40s以后才能接受到设定大小的数据,客户机45ms发送一次数据。服务器前面大概40s,一般是45ms,0.07ms间隔出现,数据也必应该得到的少。哪位高手指点一下吧!
nuaawenlin 2005-05-19
  • 打赏
  • 举报
回复
没有大小限制,

tcp的发送是有一些规则的

看tcp/ip详解吧
godfly000 2005-05-18
  • 打赏
  • 举报
回复
哪位帮帮忙呀?急!是数据流(stream)传送,有大小限制吗?

18,356

社区成员

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

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