我们正在编写一个使用Websocket的C ++应用程序。由于它是在嵌入式系统中使用的,因此我们使用轻量级的 noPoll C库。如果您以阻止方式进行操作,那么一切都会很好:
ctx = nopoll_ctx_new();
listener = nopoll_listener_new(ctx, HOST.c_str(), PORT.c_str());
//pass 'this' pointer to functions so they could access Websocket class members
nopoll_ctx_set_on_msg(ctx, listener_on_message, this);
nopoll_ctx_set_on_open(ctx, listener_on_open, this);
nopoll_ctx_set_on_accept(ctx, listener_on_accept, this);
//this function blocks the caller. Listens for events
nopoll_loop_wait(ctx, 1);
而且,这很糟糕。我们还有许多需要高频处理的外围设备,并且此功能会阻塞所有内容(500毫秒)。我设法编写了一个简单的websocket处理程序函数,该函数在我的main
while(true)
循环中调用:>
void Websocket::handler() {
noPollConn *conn = nopoll_conn_accept(ctx, listener);
if (conn) {
nopoll_conn_complete_handshake(conn);
//there I store the connected connections
conns.push_back(conn);
}
//CHECK IN EVERY CONNECTION IF THERE ARE ANY MESSAGES
//...loop through connections
}
如前所述,这个简单的处理程序在main
while(true)
循环中被调用并且可以正常工作。但是问题在于,现在我找不到任何方法来检查连接是否已关闭(用户已断开连接)。函数nopoll_conn_is_ok(noPollConn *conn)
始终返回true
。
问题是,是否至少有可能编写某种non-blocking
Websocket处理程序?其他C / C ++库(例如 websocket ++ 或 libwebsocket )具有相同的实现方式,但具有阻塞方式。也许有人有自己的实现?