Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C poll()在使用0超时调用时保留传入数据_C_Linux_Sockets - Fatal编程技术网

C poll()在使用0超时调用时保留传入数据

C poll()在使用0超时调用时保留传入数据,c,linux,sockets,C,Linux,Sockets,我的应用程序通过在零超时的情况下调用poll()来检查TCP套接字中的传入数据。99%的时间它工作正常,当套接字上有数据时,它设置POLLIN标志。但是,有时套接字上有数据(我在wireshark上看到了消息),但是poll()返回0(超时),并且不设置POLLIN标志。当另一条消息出现时,它将在几秒钟后设置POLLIN标志 这是正常的行为吗?poll()是否总是在超时之前至少检查一次传入数据 根据,Linux手册页对此并不十分清楚。我在poll()中传递了10毫秒的超时时间,重现了这个bug。

我的应用程序通过在零超时的情况下调用poll()来检查TCP套接字中的传入数据。99%的时间它工作正常,当套接字上有数据时,它设置POLLIN标志。但是,有时套接字上有数据(我在wireshark上看到了消息),但是poll()返回0(超时),并且不设置POLLIN标志。当另一条消息出现时,它将在几秒钟后设置POLLIN标志

这是正常的行为吗?poll()是否总是在超时之前至少检查一次传入数据


根据,Linux手册页对此并不十分清楚。

我在poll()中传递了10毫秒的超时时间,重现了这个bug。经过进一步调查,我发现问题是由一个封装unix套接字API的库中的错误引起的。它将数据从套接字加载到缓冲区,然后在使用缓冲区中的所有字节之前轮询套接字以获取更多数据。无论如何,谢谢你的评论


因此,即使超时为0,poll()也可以正常工作。

您确定看到的是完整的数据,即不是先前数据丢失的TCP数据段,因此TCP堆栈正在等待重新传输吗?或者,如果是UDP,UDP数据包可能会被丢弃?您可以提供poll()调用的代码片段吗?
poll
对于
POLLIN
,零超时意味着不超过“查看接收缓冲区中是否有我可以立即读取的(有效)数据,否则立即返回”。这并不意味着“验证是否有数据报到达了线路”或其他任何事情。您是否已验证数据报的校验和对Wireshark看到的这些数据报有效,并且它们不是重新发送?在这种情况下,Poll显然不会报告POLLIN,因为接收缓冲区中不会放置任何内容
poll
从不检查传入的数据,它会检查传入的数据(是的,它总是只检查一次(不是更频繁),或者在指定的时间内阻塞)。