请参考我之前的问题获取代码示例套接字:有时(很少)数据包在接收过程中丢失 https://stackoverflow.com/questions/9826194/sockets-sometimes-rarely-packets-are-lost-during-receiving
我需要始终从 UDP 多播套接字接收数据。这是单向通信,我只需要监听新数据并尽快处理它。
我应该使用while(true)
?我不喜欢while(true)
因为在我看来这会给处理器带来很多额外的工作。也许 c# 提供了其他回调技术或其他技术?
2 到 6 个套接字(评论)可能是一个有趣的地方,阻塞或异步 IO 都可以正常工作,因为您不会用线程淹没机器。每秒 2000 个数据包,听起来有足够多的数据可以让线程保持忙碌。你不需要担心while(true)
from a 表现的角度来看,自从Receive
方法将阻塞直到数据可用,所以它是never做一个什么都不做的热循环。然而!就我个人而言,从美观的角度来看,我同意while(true)
是不必要的印迹,因此如果您使用封闭方法,也许可以考虑:
int bytesRead;
while((bytesRead = socket.Receive(buffer)) > 0) {
// process bytesRead from buffer
}
当套接字关闭时,它将干净地退出。
You can also使用以下任一方法执行此操作BeginReceive
and Socket.ReceiveAsync
方法,它不使用阻塞调用,而是使用事件或回调。这些在处理大量连接时特别有用。
亲自,我倾向于做的是使用Socket.Available
;如果这是正数,则有数据缓冲并准备好使用,所以一个简单的Receive
可用于快速获取该数据,而无需上下文切换。如果为零,则没有数据现在可用,因此异步调用可能更合适。这平衡了上下文切换和直接调用。请注意,ReceiveAsync
方法也通过返回值内置了这个ReceiveAsync
(这是true
如果操作未完成,稍后将调用回调 - 并且false
如果操作是already完整的,并且no将调用回调)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)