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?
答案 0 :(得分:4)
习惯于:
未启用SO_OOBINLINE
时出现带外数据。
在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机制。