我正在使用 select() 轮询函数来确定何时可以从套接字读取数据。我这样做是为了我不必依赖像 accept() 和 recv() 这样的阻塞函数。由于 select() 阻塞直到文件句柄有数据,是否有必要使用 fcntl() 将套接字设置为非阻塞?
在我看来没有必要,因为 select() 函数告诉我数据已准备好从套接字文件句柄中读取。
我见过程序员使用 select() 并将套接字设置为非阻塞的代码,我见过程序员使用 select 并保留阻塞设置的代码。哪个是正确的?使用 select() 并将套接字设置为非阻塞是否有优势?
是的,您通常应该将套接字设置为非阻塞。原因如下:
写入套接字时,可以写入套接字的事实并不一定意味着您可以在不阻塞的情况下向套接字写入所有内容。因此,如果您有大量数据要写入套接字,则写入套接字可能会阻塞,但套接字缓冲区只有较小的空间。
当从套接字读取时,有数据要从套接字读取的事实并不一定意味着那里会有你想要的所有数据(尽管如果你这样做,它会返回一个简短的读取)。
如果您一次只写入或读取一个字节,我想这将是一个例外,但这是一个罕见的例外。
| 归档时间: |
|
| 查看次数: |
311 次 |
| 最近记录: |