可以select()返回1但FD_ISSET(fd)是假的吗?

时间:2015-07-06 23:21:15

标签: c++ select tcp file-descriptor

我遇到了一个情况,我在传递的集合中使用单个文件描述符调用select(),在TCP套接字上的C ++应用程序中,它返回1,很快就在代码,select()再次被调用,并且它在描述符上返回0FD_ISSET()false(不确定哪个,我不能轻易地重现这种罕见的情况)。因此,我想知道,如果从两个调用之间的描述符中没有读取任何内容,select()可以从同一个文件描述符上的1返回0,在这种情况下是什么发生这种情况时会怎样?或者如果没有,那么即使只有一个文件描述符传递给select()1可以返回FD_ISSET()false仍然是select(),在这种情况下,当发生这种情况时会发生什么?

1 个答案:

答案 0 :(得分:0)

select()可以修改您提供的fd_set项,因此请务必每次重新设置fd_set {{1} }。

话虽如此,我们假设您正在 read fd_set参数中传递套接字。第一次调用select()并且套接字是可读的,套接字将保留在select()中,fd_set将返回1.只要套接字仍然可读,{{1}我很乐意将套接字保留在select()中。但是,如果select()返回0,则表示fd_set超时(套接字在指定的时间范围内无法读取),因此select()将从select()中删除套接字而select()将是假的。因此,需要在下次调用fd_set时重置FD_ISSET(),以便将套接字放回fd_set,以便可以再次测试。

现在,关于socket / fd_set为什么以及如何从可读状态进入不可读状态,如果没有看到管理套接字并填充select()的实际代码,很难回答在每个fd_set电话上。我的猜测是你要么没有正确地管理它们,要么你有多个线程共享socket / fd_set并以你不期望的方式践踏彼此的状态。