在循环中使用select()和accept()
pselect() with accept() in a loop
我有一个多线程服务器,它通过这些循环生成新的线程:
while(handle->m_run) {
if (handle->m_curThreadCount < handle->m_maxThreads) {
ready = pselect(socket + 1, &readSocket, NULL, NULL, &timeout, NULL);
if (ready != 1)
continue;
DWORD openedSocket = accept(socket, NULL, NULL);
handle->m_threads.emplace_back(std::thread(serverThread, openedSocket, handle));
handle->m_curThreadCount++;
}
}
大多数情况下,这可以按预期工作,但偶尔pselect()不会触发。我用tcpdump检查了它,知道数据被发送到服务器,所以我认为它与主循环有关。
同样,如果在发送数据之前使用gdb运行pselect(), pselect()将返回1。
使用pselect()这种方式是否有问题,我应该如何解决这个问题?
正如Jeremy Friesner所说,我没有在pselect()超时后重置fd_set。
Linux程序员手册含糊地说:
添加:在退出时,这些集合将被修改,以指示哪些文件描述符实际更改了状态。
FD_ZERO(&readSocket)
FD_SET(socket, &readSocket)
相关文章:
- SQLite3 在 c++ 中输出 SELECT 上的空列表
- 如何在 sys/select.h 中正确使用
- 获取具有字段名称的 SELECT 字段类型,并带有 MariaDB C++连接器
- Visual accept std::string from std::byte iterator
- UDP 套接字 select() 在某些情况下无延迟(超时)返回 1
- Winsock2 select():同一个套接字上可能有多个事件吗?
- Winsock2 select() 返回 WSAEINVAL(错误 10022)
- 将 select() 与非基于文件描述符的输入一起使用
- accept(..) 似乎正在修改我给它的文件描述符参数
- Winsock2 select() 函数:传递 {0, 0} 作为超时参数
- 如何在C++应用程序中设置"Select Precision"光标?
- C++11 中对超载'ref(Select::Expressions::Code&)'的调用模棱两可
- 为什么我们需要在 Visitor 模式中 accept(),为什么我们不能直接调用 visitor.visit()?
- 使用 select() 管理多个套接字
- 如何应用注册表模式使"select class depend on input"遵守开放封闭原则?
- WinSock c++ inet_ntop始终显示 204.204.204.204(并且 accept() 没有失败)
- 如何在 TCP/IP 服务器中中断 accept()?
- 使用 Select 多路复用未命名的管道和其他文件描述符
- 我可以使用select组合stdin和accept吗
- 在循环中使用select()和accept()