请问:程序中能不能完全接收到死循环所发出的数据?

fangxu1999 2010-01-25 10:53:25
我为了测试网络的负载压力情况,设置了一个发送数据的测试程序

// 10s测试
while(GetTickCount() - start <10000)
{
send(s, buffer, 1024, 0);
// Sleep(1);
}

发现当Sleep存在时能够完全收到数据,可是当注释掉以后,丢失数据很严重。
因为实际的数据量很快,所以存在很大的隐患,请问有办法解决吗?
谢谢了!
...全文
123 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
fangxu1999 2010-01-27
  • 打赏
  • 举报
回复
了解网络收发的问题了,谢谢大家。
lin0119 2010-01-26
  • 打赏
  • 举报
回复
应用层,根本就不用考虑拥塞的情况。
TCP协议的可靠性就是靠校验,回报,重传机制来实现的,但不在应用层处理,send()的返回值就表示已经被接收方确认正确的字节数,看看拔掉网线的情况下send()的返回值吧。
数据量多就参考一下网络下载软件的做法:把文件打小包,断点续传。
dong364 2010-01-26
  • 打赏
  • 举报
回复
要看send的返回值,返回值表达了发送是否成功,如果>0则表示已发送的字节数,楼主的这种压力测试不够好,应该创建多个连接或多个socket同时进行发送
zhou1xp 2010-01-26
  • 打赏
  • 举报
回复
如果你用的是标准的SOCKET,那么你的send函数要重新封装,一般来说,它不一定能一次发送完毕的
eyodo8 2010-01-26
  • 打赏
  • 举报
回复
打酱油!~
fangxu1999 2010-01-26
  • 打赏
  • 举报
回复
刚刚了解到错误不是在接收部分,而是发生在发送缓冲区溢出上,并不是网络上丢数据。
之前一直以为TCP协议是可靠的数据传输协议,如果这样的的话,就不能够随便发送报文了?
请问是不是凡是数据量很多、很快时,都需要人工干预来控制网络的收发啊?
还有就是上面各位说的用事件量来进行同步,可是通常情况下,网络的收发是运行在不同的主机上的,这无法直接使用事件了,是不是需要通过TCP的网络连接进行回报数据状态啊?这不就会导致网络通信更加拥塞吗?

谢谢大家。
lin0119 2010-01-26
  • 打赏
  • 举报
回复
应该检测send(s, buffer, 1024, 0); 的返回值
如果返回不成功就重发。
当你把本机的缓冲区填满以后,错误发生在你的机器上而不是在网络上。
yangcuncunzhang 2010-01-26
  • 打赏
  • 举报
回复
1楼的说的对!

典型的数据通信同步问题,你在不停发送时,接收端不一定能和你的发送速度同步,即使在速度上同步,也不能保证任何时刻都完全同步,因此,就会有来不及收数据的情况出现! 而且还会大量占用CPU时间。

典型做法是发送数据按照一定的大小,即每次发一个包(包大小自己根据实际情况决定),然后等待一个Event,此时发送端会处在等待状态,释放CPU。

此时接收方接收到数据后,设置对应的Event,发送方就会接收到这个Event(这相当于一个回应), 然后再发送下一个包。

例子可能不是非常恰当,但意思是一样的。如果你想测试网络负载能力,可以将数据包加大!
crst_zh 2010-01-25
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 zyyoung 的回复:]
做个信号量,阻塞吧
[/Quote]
我一般用Event来做
zyyoung 2010-01-25
  • 打赏
  • 举报
回复
做个信号量,阻塞吧
crst_zh 2010-01-25
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 aoyihuashao 的回复:]
有sleep的时候,为什么丢失数据?
[/Quote]
有sleep()的时候并不一定完全正确,你可以试试:数据量再加大,sleep()再缩短,发送间隔也缩短。
aoyihuashao 2010-01-25
  • 打赏
  • 举报
回复
有sleep的时候,为什么丢失数据?
crst_zh 2010-01-25
  • 打赏
  • 举报
回复
那是因为你发送的太快了来不及接收导致缓冲区被冲掉
使用sleep虽然简单,但是还不是最好,有可能太长,导致资源浪费,或者太短,还会出现数据丢失的现象。可以这样:
发送一定量的数据,等待对方一个回应信号采集需发送,利用waitforsingleobject()来等待一个事件
这种方法相当于通过接收方进行流控,我最近的几个项目都是这么做的,其中一个是通过CAN总线进行64个DSP单元的在线烧写,使用上只等待接收方的信号在进行发送,效果很好。

18,356

社区成员

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

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