在Unix网络编程中由Stevens等编写的非阻塞套接字用代码使用select调用来说明。通常在阻塞文件描述符之间选择的相同调用。
我的理解是非阻塞设计完全是选择的替代方案:我的代码可以循环检查非阻塞描述符并在其上执行其他操作,而不是在select调用中阻塞。我的理解是错误的,还是有任何关于选择调用的神秘之处,这使得它在非阻塞设计中不可避免?
根据实际情况,我需要使用大量的tcp套接字,在每个套接字上加上“个人”超时。我想过使用非阻塞设计并通过对应的数组进行循环。没有选择会不合适?
谢谢。
答案 0 :(得分:0)
可自定义的非活动计时器不应与select()
调用有任何关系。分别维护你的定时器阵列,在每个滴答或每个< x>上更新它们。迭代事件循环,每次关联的套接字有活动时重置任何计时器,当不活动达到阈值时关闭它。对于你实际处理输入/输出的方式,没有任何关系。
您是否使用select()
与是否使用非阻塞套接字正交。毕竟,select()
并不是为了阻止您对读取进行阻止。 select()
的用途是阻止您在不想时阻止。 (而不仅仅是读取:您可以始终以零超时调用select()
,并且select()
也不会阻止)。此外,它提供了一种机制,用于了解何时输入比“迭代我的整个套接字,在每个套接字上依次尝试非阻塞read()
更有效”。