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

4

这是选择语句的原型(根据手册):

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

我知道如何使用readfds参数:通过它,您可以查看是否有数据写入到您的某个套接字中。另一方面,我找到的writefds页面说明,它是用来查看“任何一个套接字是否准备好发送()数据”。但这是什么意思呢?在Quin和Shute的《Windows套接字网络编程》一书中,它说这可以检测连接或可写状态。这有什么意义呢?它只是为了检查套接字是否仍然与已连接的客户端保持连接,并测试是否有任何用处写入该套接字吗?
那么,通常人们用writefds做什么呢?

select是一个已经过时的接口。如果可能的话,我建议使用像libevent这样的库(它是BSD许可证)。 - Per Johansson
1个回答

10

如果您一直向 TCP 套接字写入数据,而另一端无法像您发送的速度那样接收数据,那么会出现 write 阻塞 的情况。您需要测试“是否可以写入而不阻塞”以避免此问题。因为在测试程序中通常不会发生这种情况,所以这可能会让人感到震惊,但是 write(2)send(2) 可能会阻塞

因此,如果 select(2)writefds 中设置了一个 fd,则意味着在其上执行任何 writesend 操作都将实际写入至少一个字节而不会阻塞。

编辑

根据标准:

函数 pselect() 应该检查文件描述符集,在 readfds、writefds 和 errorfds 参数中传递它们的地址,以查看某些描述符是否已准备好读取,已准备好写入或存在异常条件待处理。


1
好的,谢谢。这正是我在寻找的答案。顺便问一下,为什么您写select(2)而不是select()?这意味着什么? - Django
1
@Django 这是手册章节2用于系统调用。 - cnicutar
是的,好的,我看到了,但你从哪里得到那个有趣的细节,即可写状态意味着它将发送至少一个字节? - Django
你是否同意Per所说的话(见上文),即select()是一种过时的接口,建议现代程序员不再使用它? - Django
这些函数是标准C库中的还是额外的库? - Django
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接