select()
如果为其选择的其中一个套接字发出了错误信号,则它本身不会返回错误。[实际上,API无法以这种方式指示每个套接字的错误,因为两个不同的套接字可能在的一次调用中就各自获取挂起的错误select()
。哪一个会select()
回来?]- 在循环的每次迭代之后
select()
,您改而使用FD_ISSET宏read()
在每个标记为可读的套接字上尝试。 - 每当套接字设置了未决的错误集时,都会发信号通知其读取事件(和写入事件)并
select()
返回,从而使您可以立即拾取由于保持活动状态而导致的超时错误。请注意,选择标记要读取的套接字并不表示有数据要读取,只是读取尝试不会被阻止。如果套接字有未决错误要检索,则读取不会阻塞。无论read(2)
和write(2)
第一甚至试图以处理任何数据之前检索套接字上任何挂起的错误。
当对O_NONBLOCK清除的输入函数的调用不会阻塞时,无论该函数是否成功传输数据,都应认为描述符已准备就绪,可以读取。(该函数可能返回数据,文件结尾指示或一个错误,表明该文件已被阻止,并且在每种情况下,描述符都应视为可以读取。)[
POSIX:select() ]
- 最后,返回什么错误?至关重要的是,这取决于保持连接失败的方式。
ETIMEDOUT
如果另一端完全消失,您会得到的。如果发生数据包传递错误,您将转而通过(因此,如果保持活动的数据包收到ICMP错误回复,例如“主机不可达”,则将已EHOSTUNREACH
传递)。[有关这些情况的更多详细信息,请参见Stevens,“ Unix网络编程,第1卷”。]
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)