我有一组TCP套接字(间隔1分钟),由select(2)
循环控制(选择读)。
select(2)
会返回错误吗?read(2)
将返回哪个错误?发布于 2012-12-12 13:43:30
select()
本身不会返回错误。事实上,API不能以这种方式指示每个套接字错误,因为两个不同的套接字可以在单个select()
调用期间获得一个挂起的错误。select()
会返回哪一个?select()
循环的每一次迭代之后,您可以使用FD_ISSET宏在标记为可读的每个套接字上尝试一个read()
。select()
会返回,这样您就可以捕获由于保持-活动而导致的超时错误。请注意,选择标记为read的套接字并不表示要读取数据,而只是表示试图读取不会阻止。如果套接字有一个挂起的错误要检索,读取将不会阻塞。在尝试处理任何数据之前,read(2)
和write(2)
都首先检索套接字上任何挂起的错误。
当对具有O_NONBLOCK清除的输入函数的调用不会阻塞时,无论该函数是否会成功地传输数据,描述符都应被视为可以读取。(该函数可能返回数据、文件结束指示或错误,而不是指示它被阻塞的错误,在每种情况下,描述符都应被视为可以读取。) [POSIX:select()]ETIMEDOUT
。如果出现了数据包传递错误,您将通过它(因此,如果保持活动的数据包得到一个ICMP错误答复,比如“主机不可达”,您将得到EHOSTUNREACH
)。有关这些情况的详细信息,请参阅Stevens,"Unix网络编程,第1卷“。
发布于 2012-12-12 13:11:59
select()
在FDSET
中设置一个位,指示哪个套接字已经触发。使用ISSET宏确定哪个套接字请求服务。
https://stackoverflow.com/questions/13824231
复制相似问题