sockets - 如果上次 read() 没有读取到数据, poll() 会立即返回 UDP 套接字吗?

标签 sockets udp

现有的UDP套接字程序是这样编写的(阻塞模式):

while (true) {
    poll();
    if (POLLIN is set) {
        read(fd, buf, bufSize);
    }
}

对于 UDP,每个 read() 读取 1 个且仅读取 1 个数据报(数据包)。如果套接字recv buf中有多个可用数据包,则上述代码在每次read()时仅读取1个数据包。我的问题是:下一个 poll() 会立即返回,因此上面的代码仍然可以很快地从套接字读取吗?或者下一个 poll() 是否可以等待,直到有新的数据包到达套接字,从而代码实际上落后于读取?

文档似乎建议只要缓冲区中有数据,下一个 poll() 就会立即返回。但代码阅读起来似乎落后了,不知道原因是在上面的代码中还是其他地方。

首选方式可能是:

set the socket to non blocking
read in the loop until errno = EWOULDBLOCK or EAGAIN

谢谢。

最佳答案

如果调用poll()时套接字缓冲区中已经有数据,则在请求POLLIN时应立即发出POLLIN信号,是的。在发送 POLLIN 信号之前,它不应等待下一个数据包到达缓冲区。

关于sockets - 如果上次 read() 没有读取到数据, poll() 会立即返回 UDP 套接字吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38254042/

相关文章:

文件传输后 Java Socket 消息不可读

java - Apache MINA 服务器在 60 秒后关闭 Activity UDP "session"

c# - 发送或接收数据的请求被禁止,因为套接字未连接 - 发送数据时

javascript - 使用 UDP 的 Node.js 文件传输

c# - 如何使用udp从C#客户端与C服务器通信?

Android - 无法安装 *smartsocket* 监听器

c - forkpty - 套接字

java - Android Socket不发送数据

sockets - TCP传输持续时间

c - 用C语言在UDP套接字上传输文件! Linux