我已經使用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)
上獲得它們。