繁体   English   中英

Unix套接字:与多个关联的select()关联的功能超出其应有的功能

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM