gpt4 book ai didi

c# - 我应该使用 while(true) 从 Socket 接收数据吗?

转载 作者:太空狗 更新时间:2023-10-29 19:41:31 26 4
gpt4 key购买 nike

代码示例请引用我之前的问题Sockets: sometimes (rarely) packets are lost during receiving

我需要始终从 UDP 多播套接字接收数据。这是一种单向通信,我只需要监听新数据并尽快处理它。

我应该使用 while(true) 吗?我不喜欢 while(true) 因为在我看来这会给处理器带来很多额外的工作。可能 c# 提供了其他回调技术或其他什么?

最佳答案

2 到 6 个套接字(注释)可能是有趣的地方,阻塞或异步 IO 都可以正常工作,因为您不会用线程淹没机器。每秒 2000 个数据包,听起来有很多东西可以让线程保持忙碌。从性能的角度来看,您无需担心while(true),因为Receive 方法会阻塞直到数据可用,所以它从不做一个什么都不做的热循环。然而!就个人而言,从美观的角度来看,我同意 while(true) 是不必要的污点,因此如果您使用阻塞方法,可以考虑:

int bytesRead;
while((bytesRead = socket.Receive(buffer)) > 0) {
// process bytesRead from buffer
}

当套接字关闭时,它将干净地退出。

也可以使用 BeginReceiveSocket.ReceiveAsync 方法执行此操作,它们不使用阻塞调用,而是使用事件或回调。这些在处理大量连接时特别有用。

个人,我倾向于使用Socket.Available;如果这是肯定的,则有数据缓冲并准备好使用,因此可以使用简单的 Receive 立即获取该数据,而无需上下文切换。如果它为零,则当前 没有数据可用,因此异步调用可能更合适。这平衡了上下文切换与直接调用。请注意,ReceiveAsync 方法也内置了此功能,通过 ReceiveAsync 的返回值(如果操作未完成,则为 true,并且稍后将调用回调 - 如果操作已经完成,则为 false,并且将调用没有回调。

关于c# - 我应该使用 while(true) 从 Socket 接收数据吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9835179/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com