处理select()时到达的数据

时间:2013-07-09 00:27:25

标签: network-programming

我在我的应用程序中使用select()调用的方式与在此处使用的方式相同: beej.us/guide/bgnet/examples/selectserver.c

也就是说,我调用select(),循环遍历所有文件描述符来处理数据,然后再次调用select()。但是,我想知道在循环和处理数据时到达的数据会发生什么? select()会立即返回,还是会等到它看到新数据?

问题的核心是,当有可用(旧)数据到recv()时,是否立即返回,还是等待新数据到达?

2 个答案:

答案 0 :(得分:1)

如果有可用数据,则select()立即返回。它不会等待更多数据到达。如果没有数据则会阻塞并等待。

在某种程度上,这必须是真的,因为具有O_NONBLOCK标志的文件描述符永远不会阻塞,但select()必须仍然有效。

答案 1 :(得分:1)

select会通知您套接字上是否有要读取的数据(在本例中)。当它到达时它不关心,只有如果它就在那里。

因此,无论如何,您都会从select获得返回指示。以类似的方式,您可能会发现,如果您在套接字上有5个字节时收到通知,并且在select返回和您调用read之间出现另外5个字节。在这种情况下,你得到10个字节,但没关系。它不会将这5个字节“携带”到下一个select