gpt4 book ai didi

c - 如果我使用 select() 轮询方法,我应该将套接字设置为非阻塞吗?

转载 作者:可可西里 更新时间:2023-11-01 02:33:45 25 4
gpt4 key购买 nike

我正在使用 select() 轮询函数来确定何时有数据要从套接字读取。我这样做是为了不必依赖像 accept() 和 recv() 这样的阻塞函数。由于 select() 阻塞直到文件句柄有数据,是否有必要使用 fcntl() 将套接字设置为非阻塞?

在我看来没有必要,因为 select() 函数告诉我数据已准备好从套接字文件句柄中读取。

我见过程序员使用 select() 并将套接字设置为非阻塞的代码,我也见过程序员使用 select 并保留阻塞设置的代码。哪个是对的?使用 select() 并将套接字设置为非阻塞有优势吗?

最佳答案

是的,您通常应该将套接字设置为非阻塞。原因如下:

  • 写入套接字时,您可以写入套接字并不一定意味着您可以无阻塞地向套接字写入所有内容。因此,如果您有大量数据要写入套接字,则写入套接字可能会阻塞,但套接字缓冲区只有较小的空间。

  • 从套接字读取时,有数据要从套接字读取的事实并不一定意味着那里会有您想要的所有数据(尽管如果您这样做,它会返回一个简短的读取)。

如果您一次只写入或读取一个字节,我想那会是一个异常(exception),但这是一个罕见的异常(exception)。

关于c - 如果我使用 select() 轮询方法,我应该将套接字设置为非阻塞吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32683284/

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