gpt4 book ai didi

sockets - 使用具有 "select"功能的非阻塞套接字有什么好处?

转载 作者:行者123 更新时间:2023-12-04 17:02:20 24 4
gpt4 key购买 nike

我正在 Linux 中编写一个服务器,它必须支持来自多个客户端的同时读/写操作。我想使用 select 功能来管理读/写可用性。

我不明白的是:假设我想等到套接字有数据可供读取。 select 的文档声明它会阻塞,直到有数据可供读取,并且 read 函数不会阻塞。

所以如果我使用 select 并且我知道 read 函数不会阻塞,为什么我需要将我的套接字设置为非阻塞?

最佳答案

在某些情况下,套接字被报告为就绪,但当您检查它时,它会更改其状态。

一个很好的例子是接受连接。当一个新的连接到达时,一个监听套接字被报告为准备好读取。当您调用 accept 时,连接可能在发送任何内容之前以及在我们调用 accept 之前被另一方关闭。 .当然,这种情况的处理取决于操作系统,但有可能 accept将简单地阻塞,直到建立新连接,这将导致我们的应用程序无限期地等待阻止其他套接字的处理。如果您的监听套接字处于非阻塞模式,则不会发生这种情况,您将获得 EWOULDBLOCK或其他错误,但 accept无论如何都不会阻塞。

一些内核曾经有(我希望现在已经修复)一个有趣的 UDP 和 select 错误。 .当数据报到达时select与数据报被标记为准备读取的套接字一起唤醒。数据报校验和验证被推迟到用户代码调用 recvfrom (或其他一些能够接收 UDP 数据报的 API)。当代码调用 recvfrom并且验证代码检测到校验和不匹配,数据报被简单地丢弃并且recvfrom最终被阻塞,直到下一个数据报到达。可以在 here 找到修复此问题的补丁程序之一(以及问题描述)。 .

关于sockets - 使用具有 "select"功能的非阻塞套接字有什么好处?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12772836/

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