【发布时间】:2016-04-04 22:32:01
【问题描述】:
让我们考虑下面的代码
pollfd file_descriptors[1];
file_descriptors[0].fd = sock_fd;
file_descriptors[0].events = POLLIN;
int return_value = poll(file_descriptors, 1, 0);
if (return_value == -1) { cerr << strerror(errno); }
else if (return_value == 0) { cerr << "No data available to be read"; }
else {
if (file_descriptors[0].revents & POLLIN) {
recv(sock_fd, buff, 1024, 0);
}
}
现在我对上面的代码有两个问题。
- 如果对 poll() 的调用既不返回
-1也不返回0,并在位图revents中为file_descriptors数组中的第一个条目设置了POLLIN标志,那么对 @987654328 的调用将@ 堵塞?如果不是,那么数据会被瞬时读取吗? - 假设对
poll()的调用与上述方式相同。将读入多少数据?是否与定期拨打recv()相同?即在上述情况下,任意(对程序员)数量小于或等于1024。那么如果我想在再次阅读之前poll(),我是否只是从第一次调用poll()开始重复直到所有数据都被完全读入(即在客户端服务器场景中,这将对应于正在完成的请求)?
谢谢!
【问题讨论】:
-
对于 3,请参阅 stackoverflow.com/questions/589928/…。本质上,如果一个套接字端发送正常数据和然后 OOB 数据,客户端会尽快获得OOB 数据,可能在 其他数据之前。 [嗯,这取决于客户如何调用recv,以及其他一些事情,这还不是全部......请参阅链接]
-
非常感谢!我会调查的:)
-
@deviantfan 从我在该问题的答案中读到的内容。我将忽略当前用例中的所有 OOB 数据。不过,我有一个后续问题。如果确实有一些 OOB 数据已经发送,而我忽略它,即只是定期调用 recv() 。这些数据会被忽略吗?还是会被注入到我正在读取的当前字节流中(或 recv()-ing)?
-
视情况而定。您可以使用
MSB_OOBinrecv来查询OOB 数据而没有这样的选项来查询普通数据,或者您可以使用setsockopt和SO_OOBINLINE来接收没有特殊recv选项的所有内容。 -
@deviantfan 谢谢!因此,我将忽略 OOB 数据,因为它并不完全存在。我想我很快就会删除问题的第三部分。我会稍等片刻,以确保其他人没有在输入内容。
标签: c++ sockets c++11 networking tcp