C++ 在选择功能中,什么是等待fd的异常条件?
select函数的原型是C++ 在选择功能中,什么是等待fd的异常条件?,c++,sockets,bsd,C++,Sockets,Bsd,select函数的原型是 select(int no_of_fd,fd_set read_fds,fd_set write_fds,fd_set expection_condition_fd,const struct timeval *timeout) 异常条件fd的代表什么 何时设置这些fd?用于: 未启用SO\OOBINLINE时带外数据的存在 检测Windows上的非阻塞connect()故障。如果连接成功,则将套接字放入write_fds,否则它将被放入中,但_fds除外。MSDN中记
select(int no_of_fd,fd_set read_fds,fd_set write_fds,fd_set expection_condition_fd,const struct timeval *timeout)
异常条件fd的
代表什么
何时设置这些fd?用于:
SO\OOBINLINE
时带外数据的存在connect()
故障。如果连接成功,则将套接字放入write_fds
,否则它将被放入中,但_fds
除外。MSDN中记录了该功能:
总之,在以下情况下,当select返回时,将在特定集合中标识套接字:
readfds:- 如果已调用listen且连接挂起,则accept将成功。
- 数据可用于读取(如果启用了SO\u OOBINLINE,则包括OOB数据)。
- 连接已关闭/重置/终止
- 如果处理连接呼叫(非阻塞),则连接已成功。
- 可以发送数据
- 如果处理连接呼叫(非阻塞),则连接尝试失败。
- OOB数据可用于读取(仅当SO\U OOBINLINE被禁用时)
getsockopt(SOL\u socket,SO\u error)
查询套接字中的特定错误代码(如果需要)
在其他一些平台上,例如Linux,select()
总是将套接字放入write\u fds
中,无论连接成功还是失败,您都必须查询错误代码以进行区分。Linux手册页上记录了此函数:
返回值如果连接或绑定成功,则返回零。出现错误时,返回-1,并正确设置errno。
…
EINPROGRESS
套接字是非阻塞的,无法立即完成连接通过选择用于写入的套接字,可以选择(2)或轮询(2)以完成。选择(2)指示可写性后,使用getsockopt(2)读取SOL_SOCKET级别的SO_错误选项,以确定connect()是成功完成(SO_错误为零)还是失败(SO_错误是此处列出的常见错误代码之一,解释了失败的原因)。
标准调用了它们,但没有说明应该报告哪些错误。实际上,
errorfds
不经常用于错误。它用于“异常”,其中一个是带外数据-例如TCP URG机制。发生错误时-例如,当连接关闭时。@IgorTandetnik:关闭的连接通常会向读取fd_集发出信号,而不是异常fd_集。@lgor Tandetnik是这样吗?。我认为当客户端关闭它的连接时,将设置read fds。但我不确定你能不能在第一点上展开讨论,也许再加上一个参考?