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

时间:2014-10-16 17:37:37

标签: javascript c++ websocket poco-libraries

我正在使用Poco C ++库来设置websocket服务器,客户端可以连接到这些服务器并将一些数据流式传输到他们的Web界面。所以我有一个连续发送数据的循环,我也想监听客户端是否通过使用receiveFrame()函数关闭连接,其余的,客户端是完全被动的,不发送任何数据或任何数据。问题是receiveFrame()阻止了连接,这不是我想要的。我基本上想检查客户端是否还没有调用close()javascript函数并停止流数据(如果有)。我尝试使用

ws.setBlocking(false);

但是现在receiveFrame每次调用都会引发异常。我也尝试完全删除receiveFrame,如果通过关闭浏览器终止连接,但是如果客户端调用函数close(),则服务器仍会尝试将数据发送到客户端。那我该怎么办呢?有没有办法检查是否有接收客户端帧,如果不是继续?

2 个答案:

答案 0 :(得分:3)

你可以在一个单独的线程中重复调用Socket :: select()(带超时);当您检测到可读套接字时,请调用receiveFrame()。尽管名称具有误导性,但Socket :: select()调用会在可用的平台上包装epoll()或poll()。

您也可以使用Poco::NotificationQueue更复杂但更优雅的方式实现此功能,每次套接字可读并在处理程序中读取数据时都会发布通知。

答案 1 :(得分:0)

setBlocking()没有达到您的预期效果。这里有一点信息: http://www.scottklement.com/rpg/socktut/nonblocking.html

您可能想要做的是在套接字上使用 setReceiveTimeout()来控制在给予您后退控制之前等待的时间。然后测试您的响应并在需要时循环所有内容。 Poco文档提供了有关如何使用API​​部分的更多信息。只需查看WebSockets。