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检测它。但与此同时,我把插座放回了rfd,尽管我在那个插座上什么也没收到。
这是选择呼叫的预期行为吗?如何有序地区分发送和接收情况?
现在,当发送缓冲区为空时用rfds2 检测
这是不对的。select()将检测发送缓冲区何时有空间同时为OP_READ和OP_WRITE注册套接字几乎是不正确的。OP_WRITE几乎总是准备就绪,除非在发送缓冲区已满的短暂间隔内
感谢您的回答。我发现了自己的问题:错误代码在select调用之后(我如何使用FD_ISSET()
来确定我可以执行的操作)。
我认为我的假设是正确的,即当确实有一些数据可以接收时,rfd中只有一个套接字。
如果套接字是非阻塞的,这似乎是预期的行为。select的手册页面对readfds参数有这样的说明:
readfds中列出的将是观察角色是否可供阅读(更多确切地说,看看阅读是否不会块特别是一个文件描述符也已就绪文件末尾)
因为套接字是非阻塞的,所以读取确实不会阻塞,因此设置该位是合理的。
它不应该引起问题,因为如果你尝试从套接字中读取,你只会一无所获,读取也不会阻塞。
根据经验,无论何时select返回,您都应该处理它指示已准备好的每个套接字,如果它返回为可读取,则读取和处理任何可用的数据,如果返回为可写入,则写入更多数据。您不应该假设每次返回时只有一个事件会发出信号。
相关文章:
- 对字符数组中的元素执行逐位操作
- 排序时无法执行交换操作.我做的时候它会崩溃.为什么
- C++ 随机数生成器:尝试将结果作为向量获取,但通过制作 void 函数来执行此操作而出现错误
- 对OpenMP reduction子句中的变量执行原子操作
- 无法调用成员函数,尝试正确执行此操作仍然失败
- 不执行任何操作的函数调用C++
- 如何通过使用 2 位或更多数字的 XOR 运算符来执行此操作C++问题
- 这将执行默认移动操作吗?
- 当我告诉它通过控制台执行此操作时,我的c ++循环不会停止
- 如果普通默认构造函数不执行任何操作,为什么我们不能使用 malloc 创建平凡可构造的对象?
- 生成线程并在运行时执行其他操作,只要它处于活动状态
- 如何检测函数是否执行IO操作
- GDI+-无法对Gdiplus::Graphics(C++)执行任何操作
- 可执行文件库加载的操作
- 如何防止GUI挂起,同时允许第二次操作与Qt中的第一次操作一起执行
- 按下Arduino按钮后,如何在C#应用程序上执行操作
- 如何在没有外部库的情况下使用C++03约束执行基于正则表达式的字符串操作
- 在 "CodePad" 中执行链表操作时转储的核心(这是一个在线C++编译器)
- 是否可以访问类数据成员并在析构函数中对它们执行操作?
- 每个操作执行两次