我正处于游戏场景中。服务器和客户端都以高速率通过非阻塞UDP交换消息。理解套接字编程中的select()
(这里可能有些奇怪......)遗留代码也使用select()并将timeout值设置为0,这意味着select()不会阻塞。 Select()在永久while循环内。在select()返回一个大于0的数字时,下面的代码通过recvfrom()接收消息。如果它返回0,下面的代码不会尝试接收。
从打印输出信息中,我看到select()有时返回1(大于0)。我很困惑,因为timeout被设置为0,select()如何有时间检查消息是否准备好从任何readfds读取?谢谢。
谢谢。你能否解释为什么他们同时使用select()和non-blocking来实现即时回报?如果select()返回0,则遗留代码不会接收 - 在select()后立即返回;否则(select()返回1),这应该意味着已经有一些数据准备好接收了,因此可以安全地在没有任何阻塞时间的情况下接收它们 - 在recvfrom()之后立即返回。由于两种情况中的任何一种都能保证立即返回,为什么还要将套接字设置为非阻塞?我的理解是否正确? – Nairan 2014-10-11 13:27:25
从历史上看(在Linux之前),在阻塞套接字上的'select'后面跟着'read'永远不会阻塞,而POSIX仍然需要这个。但是Linux故意违反了POSIX,因为Linux开发人员认为POSIX要求“不可能实现”,尽管BSD自1980年代中期开始实施并实施。有关详细信息,请参阅https://lkml.org/lkml/2011/6/18/76和后续信息。 – Nemo 2014-10-11 17:51:49
谢谢,尼莫。 – Nairan 2014-10-15 14:56:24