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

标签 c# sockets

代码示例请引用我之前的问题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/

相关文章:

c - 用 C 计算出 HTTP 服务器向客户端发送了多少字节

android - 在 `adb forward` 和 `usbmuxd` 的情况下,谁应该是 socket 服务器,谁应该是客户端

Java - 分布式应用程序中的观察者/可观察者?

c# - 如何从 Jobject 获取值

c# - 无法在本地运行 master,因为我的 EF Code First 迁移不同步

c# - MVVM 和避免 Monolithic God 对象

java - FileOutputStream 删除文件内容

c# - 使用 Interop 在 C# 中创建 Word 文档的更快方法

c# - Ef-Core - 我可以使用什么正则表达式在 Db 拦截器中用 nolock 替换表名

c - 当只发送一条消息时从接收中获取两条消息