只收听websocketpp上的两个连接

时间:2015-07-12 21:08:05

标签: tcp websocket websocket++

我使用websocketpp库设置了一个简单的广播服务器,用于个人HTML + Javascript聊天。到目前为止,一切都很完美,只有一个例外。此聊天仅适用于两个人同时进行。如果第三个试图进来,他或她必须关上门。所以,逻辑是:

  

1 - >服务器在听。

     

2 - >爱丽丝连接。

     

3 - >鲍勃连接。

     

4 - >服务器停止收听。广播给Alice + Bob。

     

5 - >卡洛斯试图连接,但关闭了一个端口。

     

6 - >鲍勃断开连接。

     

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 )上获取它们。

1 个答案:

答案 0 :(得分:0)

虽然我建议重新考虑聊天应用程序的设计(也许最好有两个参与者的聊天室,而不是两个连接的整个应用程序?),我认为你可以写一个简单的& #39;脏'溶液...

...为什么不拥有"全球"如果数字太高,反驳并简单地拒绝连接?

如果要从你的代码借用,也许它看起来像这样(我不知道这是否有效,这只是一个大纲):

int connections_count = 0
void on_open( connection_hdl hdl )
{
    connections_count += 1
    if(connections_count >= 2) { return connection_hdl.close}
    // Insert
    m_connections.insert( hdl );
}
void on_close ( connection_hdl hdl )
{
    connections_count -= 1
}

因为我的C ++编码很糟糕,我将使用Plezi framework在Ruby中编写一个快速服务器示例...将其视为可以在irb中运行的伪代码(Ruby& #39;终端翻译):

require 'plezi'

class ChatCtrl
   def pre_connect
      return self.class.add_client
   end

   def on_message data
     broadcast :_post_data, data
   end

   def on_disconnect
      self.class.remove_client
   end

   def _post_data data
     response << data
   end

   # these are class methods, designated by adding `self.` to the name
   # they hold the global number of connected clients.
   # they also handle the multi-threading security, because Plezi is multi-threaded.

   def self.add_client
      @locker ||= Mutex.new # multi-thread security
      @clients ||= 0
      return false if @clients >= 2
      @locker.synchronize { @clients += 1 }
   end
   def self.remove_client
      @locker.synchronize { @clients -= 1 }
   end
end

listen

route '*', ChatCtrl

exit

我添加了一些多线程安全性,但如果您的应用是单线程的,可能不需要它。

这很难看,但它应该有效。

古德勒克!