我有一组带有保持活动的TCP套接字(间隔1分钟),由select(2)
循环控制(选择读取)。
select(2)
会返回错误吗?read(2)
会返回哪个错误?答案 0 :(得分:5)
select()
本身不会返回错误。 [实际上,API不能以这种方式指示每插槽错误,因为在select()
的单个调用期间,两个不同的套接字都可以获得挂起错误。哪一个会select()
返回?] select()
循环的每次迭代之后,您改为使用FD_ISSET宏在每个标记为可读的套接字上尝试read()
。select()
会返回,这样您就可以立即获取由于保持活动而导致的超时错误。请注意,选择标记套接字以进行读取并不表示存在要读取的数据,只表示读取的尝试不会阻止。如果套接字有待检索的挂起错误,则读取不会阻止。在尝试处理任何数据之前,read(2)
和write(2)
都会首先检索套接字上的任何挂起错误。
当对具有O_NONBLOCK clear的输入函数的调用不会阻塞时,该函数将成功传输数据时,应认为描述符已准备好读取。 (该函数可能返回数据,文件结束指示或除了表示被阻止的错误之外的错误,并且在每种情况下,描述符都应被视为已准备好进行读取。)[POSIX:select()]
ETIMEDOUT
。如果发生数据包传递错误,您将获得该错误(因此,如果保持活动数据包获得ICMP错误回复,如“主机无法访问”,则您将EHOSTUNREACH
已发送)。 [有关这些案例的更多详细信息,请参阅Stevens,“Unix网络编程,第1卷”。]
答案 1 :(得分:1)
select()
在FDSET
中设置一个位,指示哪个套接字已触发。使用FD_ISSET宏来确定要求服务的套接字。