Poco C++websockets-如何以非阻塞方式使用
Poco C++ websockets - how to use in non-blocking manner?
我正在使用Poco C++库来设置一个websocket服务器,客户端可以连接到该服务器并将一些数据流式传输到其网络接口。因此,我有一个连续发送数据的循环,我还想监听客户端是否使用receiveFrame()函数关闭连接,对于其他情况,客户端完全是被动的,不发送任何数据。问题是receiveFrame()阻塞了连接,这不是我想要的。我基本上想检查客户端是否还没有调用close()javascript函数,如果已经调用了,则停止流式传输数据。我试过使用
ws.setBlocking(false);
但现在receiveFrame每次被调用时都会抛出一个异常。我还尝试完全删除receiveFrame,如果通过关闭浏览器终止连接,它会起作用,但如果客户端调用函数close(),服务器仍会尝试向客户端发送数据。那么我该怎么做呢?是否有一种方法可以检查是否有要接收的客户端帧,如果没有,则继续?
您可以在单独的线程中重复调用Socket::select()(带超时);当检测到可读套接字时,请调用receiveFrame()。尽管名称有误导性,Socket::select()调用在可用的平台上包装epoll()或poll()。
您还可以使用Poco::NotificationQueues以更复杂但可能更优雅的方式实现这一点,每次套接字可读时都会发布通知,并读取处理程序中的数据。
setBlocking()并没有达到预期效果。以下是一些相关信息:http://www.scottklement.com/rpg/socktut/nonblocking.html
您可能想要做的是在套接字上使用setReceiveTimeout()来控制它将等待多长时间,然后再将控制权交给您。然后测试你的反应,如果需要的话,循环所有内容。Poco文档提供了更多关于如何使用API这一部分的信息。只需查找WebSockets。
- 如何在c++中为模板函数实例创建快捷方式
- 如何在 C 中正确使用 libiconv 使其不会报告"Arg list too long"?
- std::vector的包装器,使数组的结构看起来像结构的数组
- 在c代码之间共享数据的最佳方式
- 如何在全屏模式下(在OpenGL中)使背景透明
- 如何以编程方式使窗口全屏显示?
- 以编程方式防止重命名或删除文件,但仍使其可写
- 如何使 printf 以与 NSLog 相同的方式打印字符缓冲区?
- 我可以以某种方式使我的矢量/数组动态更改装置数量吗?
- 为什么这些toupper在这样使用时工作方式不同
- 使 c++ 程序以交互方式将输入输出传递给 windows 命令 prommpt
- 告诉 PDCurses 以编程方式使窗口与物理屏幕大小相同的方法
- 如何使用 calloc/malloc 等函数对动态创建的存储进行正确排序,使其以 FIFO 方式运行
- 如何使系统进入睡眠状态并再次自动(以编程方式)从睡眠状态恢复,而无需任何手动"鼠标单击或键盘点击"
- 使类信息在运行时可访问的可扩展方式
- 如何使C++类以 const 方式访问另一个类的所有私有成员(仅读取而不写入)
- 我如何使连续内存以一种安全的方式表现多态
- 以这样的方式填充数组,使每个元素等于两个数字的最小和
- 如何以编程方式使系统崩溃
- 干净的方式,使可移植的端正确的文件读取/编写代码在c++