gpt4 book ai didi

c - 带 Select 的非阻塞套接字

转载 作者:行者123 更新时间:2023-12-01 13:07:23 24 4
gpt4 key购买 nike

我不明白在 select 返回准备好读取后等待调用 recv() 之后,在非阻塞套接字上调用 recv() 与在阻塞套接字上调用 recv() 之间有什么区别。在我看来,阻塞套接字在这种情况下永远不会阻塞。
另外,我听说使用非阻塞套接字的一种模型是在经过一段时间后尝试对它们进行调用(接收/发送/等),而不是使用类似 select 的方法。与使用 select 之类的东西相比,这种技术似乎很慢而且很浪费(但是我根本没有达到如上所述的非阻塞目的)。这在当今的网络编程中很常见吗?

最佳答案

关于执行高容量 I/O 的所有不同选项的概述称为 The C10K Problem .它对许多不同的选项进行了相当完整的调查,至少截至 2006 年是这样。

引用它,关于在非阻塞套接字上使用 select 的主题:

Note: it's particularly important to remember that readiness notification from the kernel is only a hint; the file descriptor might not be ready anymore when you try to read from it. That's why it's important to use nonblocking mode when using readiness notification.

是的,你可以使用非阻塞套接字,然后有一个循环在没有准备好时等待,但与使用类似 select 或更现代的替代品之一相比,这是相当浪费的(epollkqueue 等)。我想不出为什么有人会真正想要这样做的原因;所有 select 之类的选项都可以设置超时,因此您可以在一定时间后被唤醒以执行一些常规操作。我想如果你正在做一些相当 CPU 密集型的事情,比如运行视频游戏,你可能想要永远不 sleep 而是继续计算,同时使用非阻塞套接字定期检查 I/O。

关于c - 带 Select 的非阻塞套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2015392/

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