繁体   English   中英

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

[英]If I use select() polling method, should I set sockets to non-blocking?

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

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

我已经看到程序员使用select()并且还将套接字设置为非阻塞的代码,并且我已经看到程序员使用select并且已经保留阻塞设置的代码。 哪个是对的? 使用select()并将套接字设置为非阻塞是否有优势?

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

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

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

如果您一次只编写或读取一个字节,我想这将是一个例外,但这是一个罕见的例外。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM