社区
网络编程
帖子详情
请问:程序中能不能完全接收到死循环所发出的数据?
fangxu1999
2010-01-25 10:53:25
我为了测试网络的负载压力情况,设置了一个发送数据的测试程序
// 10s测试
while(GetTickCount() - start <10000)
{
send(s, buffer, 1024, 0);
// Sleep(1);
}
发现当Sleep存在时能够完全收到数据,可是当注释掉以后,丢失数据很严重。
因为实际的数据量很快,所以存在很大的隐患,请问有办法解决吗?
谢谢了!
...全文
153
13
打赏
收藏
请问:程序中能不能完全接收到死循环所发出的数据?
我为了测试网络的负载压力情况,设置了一个发送数据的测试程序 // 10s测试 while(GetTickCount() - start <10000) { send(s, buffer, 1024, 0); // Sleep(1); } 发现当Sleep存在时能够完全收到数据,可是当注释掉以后,丢失数据很严重。 因为实际的数据量很快,所以存在很大的隐患,请问有办法解决吗? 谢谢了!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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单元的在线烧写,使用上只等待接收方的信号在进行发送,效果很好。
程序
死循环
问题 编程结束了,我们的
程序
跑起来了。但是我们不知道其是否能终止,结果是否正确等等。我们面临着一系列的问题。
死循环
是一个非常让人反感的问题,它 有时候是站在
程序
正常运行的外面下,进行着错误的行为,有时候很久才能发现这个问题。(而在这个过程中也会造成很大的损失) 容易造成损失的地方,人们就会尝试去解决这些问题。 为了避免这样的问题,人们开发了一些检测的方法,用来检测
程序
中可能存在
c语言写
死循环
程序
,通过简单的例子看c
程序
死循环
在解释什么是
程序
死循环
之前,先看一段代码,直观感受一下:事实上,“Welcome to my town”在运行窗口是不断无休止的执行的。单就这个
程序
来说,每当执行一遍循环时,数组里面的内容被放进了×××
数据
0,即就是说,arr[0]——arr[9]里放的内容为0。因为数组长度为10,i刚好是数组的下标,数组最后一个元素为arr[9],当i自加到10的时候,按道理应该是arr[10]=0,但是考虑到...
小
程序
数据
监听(observers),避免赋值
死循环
在小
程序
开发过程中,我们通过 observers 监听处理 properties 组件数学列表的过程中,免不了对 当前
数据
进行处理 在我们对监听的
数据
进行赋值时候,会造成
死循环
,其实这个问题在大多数框架中都有这个问题。 小栗子????[错误示范] properties: { playlist: { type: Object } }, //
数据
监听 ...
usart串口只能发送
不能
接收
我花了好长时间,才看到是主函数出了问题,因为主函数在执行完打印之后,整个
程序
就结束了,这个时候还有个鸟的中断,再多中断也没用了,这个整个
程序
已经执行完了。出现的问题是单片机发送
数据
正常,但是无法
接收
数据
,当有
数据
发送给单片机的时候,单片机无法进入
接收
中断。
接收
用的是中断,当有
数据
发送给单片机的时候,会触发中断,中断函数中将接受到的
数据
再发送出去,我搞了好半天,检查了串口配置,中断配置,都没问题,最后,最后,最后,我才发现了是什么地方出了问题。
程序
非常简单,我就不放代码了,发送用的是usart1串口。
兄dei,你的代码
死循环
了吗?
前言 代码
死循环
这个话题,个人觉得还是挺有趣的。因为只要是开发人员,必定会踩过这个坑。如果真的没踩过,只能说明你代码写少了,或者是真正的大神。 尽管很多时候,我们在极力避免这类问题的发生,但很多时候,
死循环
却悄咪咪的来了,坑你于无形之中。我敢保证,如果你读完这篇文章,一定会对代码
死循环
有一些新的认识,学到一些非常实用的经验,少走一些弯路。
死循环
的危害 我们先来一起了解一下,代码
死循环
到底有哪些危害?
程序
进入假死状态, 当某个请求导致的
死循环
,该请求将会在很大的一段时间内,都无法获取接口的返回,
程序
好
网络编程
18,356
社区成员
64,161
社区内容
发帖
与我相关
我的任务
网络编程
VC/MFC 网络编程
复制链接
扫一扫
分享
社区描述
VC/MFC 网络编程
c++
c语言
开发语言
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章