什么是在select函数中等待fd的异常条件?

时间:2014-08-18 18:16:05

标签: 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)

exception condition fd's代表什么?

什么时候设置fd?

2 个答案:

答案 0 :(得分:4)

习惯于:

  1. 未启用SO_OOBINLINE时出现带外数据。

  2. 在Windows上检测到非阻塞connect()失败。如果连接成功,则将套接字放入write_fds,否则将其放入except_fds。这在MSDN上记录为select()函数:

      

    总之,当select返回时,将在特定集中标识套接字:

         

    readfds:

         
        
    • 如果已调用listen且连接处于暂挂状态,则接受将成功。
    •   
    • 数据可供阅读(如果启用了SO_OOBINLINE,则包括OOB数据)。
    •   
    • 连接已关闭/重置/终止。
    •   
         

    writefds:

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

    exceptfds:

         
        
    • 如果处理连接呼叫(非阻塞),则连接尝试失败。
    •   
    • OOB数据可供阅读(仅当禁用SO_OOBINLINE时)。
    •   

    如果发生故障,您可以根据需要使用getsockopt(SOL_SOCKET, SO_ERROR)在套接字中查询特定错误代码。

    在某些其他平台上,例如Linux,select()始终将套接字置于write_fds,无论连接是成功还是失败,您都必须查询错误代码以进行区分。这在connect(2)函数的Linux手册页中有记录:

      

    返回值
      如果连接或绑定成功,则返回零。出错时,返回-1,并正确设置errno   ...
      EINPROGRESS
      套接字是非阻塞的,无法立即完成连接。 可以通过选择用于写入的套接字来选择(2)或轮询(2)以完成。在select(2)表示可写性之后,使用getsockopt(2)读取SOL_SOCKET级别的SO_ERROR选项以确定connect()是否成功完成(SO_ERROR为零)或失败(SO_ERROR是此处列出的常见错误代码之一,解释了失败的原因)。

答案 1 :(得分:1)

标准称他们为errorfds,但没有说出应该准确报告哪些错误。实际上,errorfds通常不会用于错误。它用于"例外",其中一个是带外数据 - 例如TCP URG机制。