C++ select() 递减文件描述符计数
c++ select() decrement file descriptor count
情况
是这样的:
创建并初始化fd_set:
fd_set readset; //fd_set named readset
FD_ZERO(&readset); //clearing fd_set
FD_SET(listen_socket, &readset); //adding a listening socket to readset
/*use for timeout*/
timeval blocktime;
blocktime.tv_sec=0;
blocktime.tv_usec=0;
现在,当前值显示listen_socket
已添加到读取集中:
readset.fd_count = 1
readset.fd_array[0] = 116
以下说明中出现问题:
int err = select (0x7FFFFFFF, &readset, NULL, NULL, and blocktime);
我希望select()
会返回值 1,因为我在 readset 中添加了一个侦听套接字。相反,select()
返回 0,并且 readset.fd_count 的值递减 1。
新值为:
readset.fd_count = 0 readset.fd_array[0] = 116
我找不到这里发生了什么。我在Windows 7上编程。任何帮助将不胜感激!
您传递的有效超时为零。它正确地更新了读取集,以告诉您,在允许的零时间内,读取集中的零套接字具有可读数据。
三个选项:
- 给它更长的超时时间,这样它就有机会找到一些事情来做
- 循环,直到它更新您的读取集以指示某些内容具有可读数据
- 将超时参数设置为 null 以无限期阻止
您可能希望在那里组合 #1 和 #2,但这取决于您的用例。
阅读文档。 select()
更新提供的fd_set
记录,以指示哪些套接字满足请求的状态。 返回值>0 表示满足一个或多个套接字,0 表示发生超时且在指定的超时期限内没有满足任何套接字,-1 表示错误。 您使用的超时为 0,因此如果套接字不能立即读取,则读取fd_set
将被清除。
顺便说一句,select()
的第一个参数不在 Windows 上使用,应设置为 0。
相关文章:
- 使用VerQueryValue检索应用程序的文件描述
- 如何在C/C++中用FD_set Unix设置套接字文件描述符
- I2C 文件描述符上的 I2C 总线可写/可读标志
- 许多文件描述符在调用sys_clone时
- AMQP-CPP >处理程序中的错误文件描述符
- 如何使用 WINAPI 和 C++ 提取可执行文件的文件描述?
- 正在等待在非阻塞文件描述符上长时间运行ioctl
- 有没有适用于Windows.lib文件的GNU二进制文件描述符(BFD)
- 如何强制文件描述符缓冲我的输出
- 如何从 boost::asio::ssl::stream<boost::asio::ip::tcp::socket> 获取本机套接字文件描述器?
- 哪个更适合从C++写入敏感的日志文件,在文件描述符上写()或文件上的fprintf()?
- 将 select() 与非基于文件描述符的输入一起使用
- accept(..) 似乎正在修改我给它的文件描述符参数
- 使用 Select 多路复用未命名的管道和其他文件描述符
- 提升 ASIO 绑定:错误的文件描述符
- 使用文件描述符移动对象
- 无法从零MQ ZMQ_SERVER套接字中获取文件描述符
- read() 上的不同行为取决于写入不可写内存时表示文件、匿名管道或套接字的文件描述符
- 我是否需要在使用它的 R 包的描述文件中导入 RccpEigen,或者"LinkingTo"足够?
- GCC链接器描述文件强制符号位于特定地址