Network programming 处理select()时到达的数据

Network programming 处理select()时到达的数据,network-programming,Network Programming,我在应用程序中使用select()调用的方式与此处使用的方式相同: beej.us/guide/bgnet/examples/selectserver.c 也就是说,我调用select(),遍历所有文件描述符来处理数据,然后再次调用select()。然而,我想知道当我在循环和处理数据时,到达的数据会发生什么情况?select()会立即返回,还是等到看到新数据时再返回 问题的核心是,select()是否在recv()有可用(旧)数据时立即返回,还是等待新数据到达?如果有可用数据,select()立

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

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


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

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


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

选择
会通知您套接字上是否有要读取的数据(在本例中)。它不在乎它何时到达,只要它在那里


因此,您将从
select
中获得返回指示。以类似的方式,您可能会发现,如果在套接字上通知您它有5个字节,并且在
选择
返回和您调用
读取
之间会出现另外5个字节。在这种情况下,可以得到10个字节,但这很好。它不会将这5个字节“携带”到下一个
select

我做了更多的挖掘,人们说select是水平触发的,而不是边缘触发的。这基本上就是我所指的吗?