Network programming 处理select()时到达的数据
我在应用程序中使用select()调用的方式与此处使用的方式相同: beej.us/guide/bgnet/examples/selectserver.c 也就是说,我调用select(),遍历所有文件描述符来处理数据,然后再次调用select()。然而,我想知道当我在循环和处理数据时,到达的数据会发生什么情况?select()会立即返回,还是等到看到新数据时再返回Network programming 处理select()时到达的数据,network-programming,Network Programming,我在应用程序中使用select()调用的方式与此处使用的方式相同: beej.us/guide/bgnet/examples/selectserver.c 也就是说,我调用select(),遍历所有文件描述符来处理数据,然后再次调用select()。然而,我想知道当我在循环和处理数据时,到达的数据会发生什么情况?select()会立即返回,还是等到看到新数据时再返回 问题的核心是,select()是否在recv()有可用(旧)数据时立即返回,还是等待新数据到达?如果有可用数据,select()立
问题的核心是,select()是否在recv()有可用(旧)数据时立即返回,还是等待新数据到达?如果有可用数据,select()立即返回。它不会等待更多的数据到达。如果没有数据,它就会阻塞并等待
在某种程度上,这必须是真的,因为带有O_NONBLOCK标志的文件描述符永远不会阻塞,但select()必须仍然有效
选择
会通知您套接字上是否有要读取的数据(在本例中)。它不在乎它何时到达,只要它在那里
因此,您将从
select
中获得返回指示。以类似的方式,您可能会发现,如果在套接字上通知您它有5个字节,并且在选择
返回和您调用读取
之间会出现另外5个字节。在这种情况下,可以得到10个字节,但这很好。它不会将这5个字节“携带”到下一个select
我做了更多的挖掘,人们说select是水平触发的,而不是边缘触发的。这基本上就是我所指的吗?