我有一组与保活(间隔1分钟)TCP套接字,通过受控的select(2)
环(选择用于读出的)。
- 将
select(2)
如果保持活动超时发生在一组的插口内返回一个错误? - 这错误将
read(2)
回报?
我有一组与保活(间隔1分钟)TCP套接字,通过受控的select(2)
环(选择用于读出的)。
select(2)
如果保持活动超时发生在一组的插口内返回一个错误? read(2)
回报? select()
本身不一样,如果发出错误信号为它选择的插槽中返回一个错误。 [事实上,API不能指示每个插槽的错误这种方式,因为有两个不同的插座可以在每个单一通话过程中获得挂起的错误select()
哪一个会select()
返回?] select()
循环中,而是使用FD_ISSET宏来尝试read()
标记读取每个插座上。 select()
的回报,让你拿起由于保活立即超时错误。 请注意,选择标记为读取插槽并不表明有数据读取,只有阅读的尝试不会阻止。 如果插座有一个未决错误检索,阅读不会阻止。 这两种read(2)
和write(2)
第一个尝试甚至以处理任何数据之前检索套接字上任何挂起的错误。 一个描述符应阅读时输入功能的调用与O_NONBLOCK明确不会阻止,该功能是否会成功传输的数据被认为是准备好了。 (该函数可能返回数据,结束文件的指示,或多于一个的指示它被阻塞,并且在每一种情况下的描述符应考虑准备用于读取其它错误。)[ POSIX:选择() ]
ETIMEDOUT
如果另一端完全消失。 如果发生数据包传输错误,你会得到通过,而不是(所以如果保留的数据包得到一个ICMP错误回复,如“主机不可达”,你就会有EHOSTUNREACH
交付)。 [关于这些案件的详细信息,请参阅史蒂文斯,“UNIX网络编程,第1卷”。] select()
设置一个位在FDSET
指示哪个插座已触发。 使用FD_ISSET宏来确定哪个插座要求的服务。