[英]Unix Sockets: select() with more than one set associated does more than it should do
我对tcp套接字有以下选择调用:
ret = select(nfds + 1, &rfds, &rfds2, NULL, &tv);
当我发送到大数据(非阻塞模式)时,将使用rfds2。 rfds可以检测我们是否在套接字上收到了东西。
现在,当发送缓冲区为空时,我使用rfds2对其进行检测。 但是与此同时,我在rfds中恢复了套接字,尽管在该套接字上什么也没收到。
这是选择呼叫的预期行为吗? 如何区分发送和接收情况?
现在,当发送缓冲区为空时,我使用rfds2进行检测
那是不对的。 select()将检测发送缓冲区何时有空间。 同时为OP_READ和OP_WRITE注册一个套接字几乎是不正确的。 OP_WRITE几乎总是准备就绪,除了在发送缓冲区已满的短暂间隔内。
感谢您的回答。 我自己发现了问题:错误的代码是在select调用之后进行的(我如何使用FD_ISSET()
确定可以执行的操作)。
我认为我的假设是正确的,当确实有一些数据可以接收时,rfds中只有一个套接字。
如果套接字是非阻塞的,那似乎是预期的行为。 select的手册页上有关于readfds参数的说明:
将监视readfds中列出的那些字符,以查看是否可以读取字符(更准确地说,是查看读取是否将被阻止;尤其是在文件末尾也准备好文件描述符)
因为套接字是非阻塞的,所以读不会阻塞是正确的,因此设置该位是合理的。
它不会引起问题,因为如果您尝试从套接字读取数据,则只会返回任何内容,并且读取不会阻塞。
根据经验,每当select返回时,您都应处理它指示已准备就绪的每个套接字,如果返回为就绪读取,则可以读取和处理任何可用数据,如果返回为ready则写入更多数据,写。 您不应该假设每次返回仅会通知一个事件。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.