如果有没有从上一次读取()读取的数据,poll()会立即返回UDP套接字吗?

时间:2016-07-07 19:44:24

标签: sockets udp

现有的程序以这种方式写入UDP套接字(在阻塞模式下):

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

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

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

可能的首选方式是:

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

感谢。

1 个答案:

答案 0 :(得分:3)

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