Poco C++websockets-如何以非阻塞方式使用

Poco C++ websockets - how to use in non-blocking manner?

本文关键字:方式使 C++websockets- Poco      更新时间:2023-10-16

我正在使用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。