当前位置:编程学习 > C#/ASP.NET >>

对于网络编程,线程睡眠造成数据包丢失

  如题,有没有什么好的方法能够避免。。因为对于网络编程。。一直要while循环监听数据包,所以需要开启一个多线程,这个线程是为了将数据包写入磁盘的I/O操作,while循环再主线程中监听网络中的数据包。。但是这样子可能造成CPU达到100%,所以我们通常使用Sleep来进行切换,让其他线程有机会。。但是是不是可能发生这样子的一种情况。那就是在sleep(5)5毫秒的中间,一个数据包来了。但是这个时候线程在sleep中,而造成数据包的丢失。。
http://blog.csdn.net/Knight94/archive/2006/08/24/1111267.aspx在这个文章中博主也提出了解决说可以模仿suspend的方法。。没有懂。。大家是否有知道的。或者有好方法的。。请指教。。。谢谢 --------------------编程问答-------------------- 你可以用一个线程单独把接收的数据放到内存中,另一个线程去挨个处理 --------------------编程问答-------------------- 循环中Receive是IO操作,和CPU无关,Receive是阻塞的,不会发生100%那种情况。
sleep期间有数据,不会丢失(除非是缓冲区溢出),只要没有Receive,就还在系统缓冲区。
“丢包”假象很多情况下都是一次收了超过一个数据包。 --------------------编程问答--------------------
引用 1 楼 bdmh 的回复:
你可以用一个线程单独把接收的数据放到内存中,另一个线程去挨个处理

放入内存中,总不可能无限制的放入吧。。必然要写入磁盘啊。。这个时候就存在了I/O瓶颈了,因为SOCKET也是属于I/O的啊。。 --------------------编程问答--------------------
引用 2 楼 lizhibin11 的回复:
循环中Receive是IO操作,和CPU无关,Receive是阻塞的,不会发生100%那种情况。
sleep期间有数据,不会丢失(除非是缓冲区溢出),只要没有Receive,就还在系统缓冲区。
“丢包”假象很多情况下都是一次收了超过一个数据包。

额。。网络中的数据接收时属于I/O操作,你说的只要没有receive就不会没有。。什么意思?、
难道while的这个线程睡眠了。还能够接收到数据。。然后睡眠时间一过还能接收到? --------------------编程问答--------------------
引用 2 楼 lizhibin11 的回复:
。。。

有实例能够说明下子你的思路吗? --------------------编程问答-------------------- --------------------编程问答-------------------- http://topic.csdn.net/u/20110311/11/0d4bbac2-d0ff-49d2-9dcf-5f4c5db76fd9.html
这里面我贴了一段代码。
我觉得从你的问题来看,也没必要看什么代码,买本网络编程的书或者详细看一下《windows程序设计》,看一下msdn关于Socket类的说明,还有Reflector一下Socket类的实现比较好。 --------------------编程问答-------------------- http://www.cnblogs.com/buzzlight/archive/2010/06/30/1768493.html --------------------编程问答-------------------- 我不认为CPU可能会100%,所有操作都会自动阻塞线程,只要阻塞存在,CPU就不可能会100%,除非你while循环使用不当,循环内部没有阻塞的操作存在。
补充:.NET技术 ,  C#
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,