如何在select()语句中使用“fd_set * writefds”参数

时间:2011-08-16 09:45:10

标签: c

这是select语句的原型(根据手册页):

    int select(int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds,
           struct timeval *timeout);

我知道如何使用readfds参数:使用此参数,您可以看到数据是否已写入您的某个套接字。另一方面,我找到的writefds页面声明这是“如果有任何套接字准备发送()数据到”。但是,这是什么意思?在Quin和Shute的Windows套接字网络编程中,它说它检测连接状态或可写状态。这有什么意义?是否只是检查套接字是否仍然连接到连接的客户端并测试是否有任何用途写入该套接字?

那么:通常使用writefds的是什么?

1 个答案:

答案 0 :(得分:8)

如果您继续写入TCP套接字而另一方收不到您发送的速度,则会出现 write阻止的时间。你想避免这种情况,所以你需要测试“你可以不受阻塞地写”。因为这通常不会在测试程序中发生,所以它可能会受到冲击,但 write(2)send(2)可以阻止

因此,如果select(2)表示在fd中设置writefds,则表示其上的任何writesend实际上至少会写入一个字节阻塞。

修改

来自the standard

  

pselect()函数应检查其文件描述符集   地址在readfds, writefds 和errorfds参数中传递   是否有一些描述符可供阅读   已准备好写,或者有待处理的特殊情况,   分别