c – poll()系统调用以及之后接收或发送数据的行为

前端之家收集整理的这篇文章主要介绍了c – poll()系统调用以及之后接收或发送数据的行为前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
让我们考虑下面的代码
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并在位图中设置POLLIN标志,则为file_descriptors数组中的第一个条目设置,那么对recv()的调用会阻塞吗?如果不是,那么数据是否会被即时读取?
>假设对poll()的调用与上面提到的相同.要读入多少数据?它只是与recv()的常规调用相同吗?即,在上述情况下小于或等于1024的任意(对于编程器)量.然后,如果我想在再次读取之前想要poll(),我是否只是从poll()的第一次调用开始重复,直到完全读取所有数据(即在客户端服务器方案中,这将对应于正在完成的请求)?

谢谢!

解决方法

If the call to poll() returns neither -1 nor 0 and sets the POLLIN flag in the bitmap revents for the first entry in the file_descriptors array,then will the call to recv() block? If no,then will the data be read in instantaneously?

对poll的调用对recv的调用没有影响.是否recv块取决于您调用recv时可用的数据以及套接字是处于阻塞还是非阻塞模式.

Assuming the call to poll() goes the same way as mentioned above. How much data is going to be read in? Is it just going to be the same as a regular call to recv()? i.e. an arbitrary (to the programmer) amount less than or equal to 1024 in the above case. Then if I want to poll() before reading again,do I just repeat from the first invocation of poll() until all data has been read in completely (i.e. in a client server scenario this would correspond to the request being completed)?

假设您不想阻止,则应将套接字设置为非阻塞.你有两个基本选择.您可以调用一次receive函数,然后再次轮询.或者你可以保持呼叫接收,直到你得到“阻止”指示.如果套接字是TCP连接,则可以继续调用receive函数,直到获得“阻塞”指示或接收的字节数少于您要求的字节数.

有三种常见的非阻塞I / O策略可以基于轮询或选择.所有都要求套接字设置为非阻塞.

1)在执行I / O操作之前,您始终可以调用poll或select.然后,只有在从poll或select中获得读取或写入命中时,才会尝试单个读取或写入操作.

2)您可以先尝试读取或写入操作.如果它立即成功,那很好.如果没有,请在重试操作之前等待轮询或选择匹配.

3)您可以在执行I / O操作之前调用poll或select.然后,您可以尝试多次读取或写入,直到您完成所需的所有操作或获得“阻塞”指示.当你得到一个“会阻塞”指示时,你要等到select或poll告诉你,然后再尝试在该套接字上的那个方向上进行另一次操作.

方法3可能是最常见的读取方法.方法2可能是写入最常见的.

请记住,轮询是一种状态报告功能,可以告诉您当前的信息,这一点非常重要.它没有任何未来的保证.假设来自轮询的读取指示意味着将来的读取操作不会被阻止是一个错误,并且它在过去引起了严重的安全隐患.保证套接字操作不会阻塞的唯一方法是将套接字设置为非阻塞.

原文链接:https://www.f2er.com/c/118327.html

猜你在找的C&C++相关文章