我已经使用websocketpp库设置了一个简单的广播服务器,用于个人HTML + Javascript聊天。一切都是完美的,直到现在,只有一个例外。此聊天仅供两个人同时使用。如果有三分之一的人尝试进来,他或她必须关上门。所以,逻辑是:只听两个连接websocketpp
1 - >服务器正在侦听。
2 - > Alice连接。
3 - > Bob连接。
4 - >服务器停止收听。广播到Alice + Bob。
5 - >卡洛斯试图连接,但得到一个端口关闭。
6 - > Bob断开连接。
7 - >卡洛斯连接。
8 - >服务器停止收听。广播给Alice + Carlos。
起初我以为这会是一件简单的事情,但经过很多错误和阅读后,我简直就被卡住了。我可以让服务器在握手过程后停止监听,但在此之后,服务器端的message_handler
停止工作,即使客户端保持完美连接,客户端也不会收到消息。我知道set_validate_handler
,我已经设置为只允许同时连接两个连接,但是由于这一点,服务器仍在监听。我需要的是一种使服务器停止监听端口的方法。
我试图关闭倾听,并保持与已建立的连接是这样的:
void on_open(connection_hdl hdl)
{
// Insert
m_connections.insert(hdl);
// Stop listening
m_server.stop_listening();
}
但是,它给了我下面的输出:
[2015-07-12 17:06:47] [connect] WebSocket Connection [::1]:58589 v13 "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.132 Safari/537.36"/101
[2015-07-12 17:06:47] [fail] WebSocket Connection Unknown - "" - 0 websocketpp:26 Operation canceled[2015-07-12 17:06:47] [info] Error getting remote endpoint: system:10009 (The file handle supplied is not valid)
[2015-07-12 17:06:47] [info] asio async_shutdown error: system:10009 (The file handle supplied is not valid)
remote_endpoint: The file handle supplied is not valid
客户端是无法连连接。否则,如果在建立连接后使用m_server.stop_listening();
,则客户端保持完美连接,但服务器停止接收其消息,或者至少我无法在void on_message(connection_hdl hdl, server::message_ptr msg)
上获得它们。