C++ 在选择功能中,什么是等待fd的异常条件?

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函数的原型是

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返回时,将在特定集合中标识套接字:

    readfds:

    • 如果已调用listen且连接挂起,则accept将成功。
    • 数据可用于读取(如果启用了SO\u OOBINLINE,则包括OOB数据)。
    • 连接已关闭/重置/终止
    writefds:

    • 如果处理连接呼叫(非阻塞),则连接已成功。
    • 可以发送数据
    例外情况:

    • 如果处理连接呼叫(非阻塞),则连接尝试失败。
    • 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。但我不确定你能不能在第一点上展开讨论,也许再加上一个参考?