0

在 Stevens 等人的 Unix Network Programming 中,非阻塞套接字使用选择调用的代码进行了说明。通常在阻塞文件描述符之间进行选择的相同调用。

我的理解是,非阻塞设计正是 select 的替代方案:我的代码不会在 select 调用中被阻塞,而是可以循环检查非阻塞描述符并在此之上执行其他操作。我的理解是错误的还是选择调用有什么神秘之处使其在非阻塞设计中不可避免?

考虑到实用性,我需要使用大量 tcp 套接字,将“个人”超时设置在每个套接字上。我想到了使用非阻塞设计并循环访问对应的数组。不选择是否合适?

谢谢你。

4

1 回答 1

0

可自定义的不活动计时器不应该与select()通话有任何关系。分别维护您的计时器数组,在每个滴答声或通过事件循环的每个 <x> 迭代时更新它们,每次关联的套接字有活动时重置任何计时器,当不活动达到阈值时关闭它。这与您实际处理输入/输出的方式无关。

你是否使用select()与你是否使用非阻塞套接字是正交的。select()毕竟,不是在那里阻止您阻止读取。这样做select()的目的是让您在不想时阻止您。(而不仅仅是读取:您始终可以select()以零超时调用,并且select()也不会阻塞)。此外,它提供了一种知道何时有输入的机制,这种机制比“遍历我的整个套接字集,read()依次尝试对每个套接字进行非阻塞”更有效。

于 2013-07-12T13:49:53.390 回答