我正在翻阅有关套接字的Asio文档,但在如何处理以下情况方面找不到任何有用的信息:
我假设在一个对等网络中有很多服务器(最多1000台)。 服务器必须定期相互通信,所以我不想每次需要时都打开一个新的客户端连接来向另一个服务器发送消息(巨大的开销)。
同时,创建n个线程,每个线程对应于一个客户端->; 服务器连接也不是真正可行的。
我将实现不同的通信方案(all-to-all,star和tree),因此1,log(n)和n个服务器必须实例化这n个套接字客户端,以创建到其他服务器的连接。
有没有一个好的方法我可以简单地做(伪代码)。
pool = ConnectionPool.create(vector<IP>);
pool.sendMessage(ip, message);
我知道在服务器端我可以使用异步连接。 但是,我并不真正知道如何从C++/ASIO中的“客户端”(发送者)角度来处理它。
TL:DR;
当我想要向N台服务器“发送”消息而不需要每次都打开N个连接,也不需要使用N个线程时,我应该使用哪些API和类“。
既然你说你想使用一个TCP(即基于连接的协议),你可以使用异步ASIO API并且可以依赖于1个线程,因为异步(即反应器模式调用)不会阻塞。
您的服务器将使用boost::asio::async_write
到boost::asio::ip::TCP::socket
,这等于发生了一个TCP连接。 发送完成后,将调用作为参数提供的回调async_write
,但async_write
将立即返回。 接收类似于客户端。 为了获得到传入客户端的TCP连接,您必须使用Boost::ASIO::IP::TCP::Resolver
,它通过客户端中的Boost::ASIO::IP::TCP::Resolver::Async_Resolver
和服务器端的Boost::ASIO::IP::TCP::Acceptor
初始化的Boost::ASIO::IP::TCP::Acceptor
来为您打开新的TCP连接/套接字。 实际上,您需要2个,IPv4和IPv6各一个。
由于服务器端的TCP连接具有某种状态,因此通常必须在中心位置跟踪,但是为了避免这种争用并缓解这种模式,通常使用继承std::ENABLE_SHARED_FROM_THIS
的类,这将在对std::ASYNC_WRITE
的回调中提供一个std::SHARED_POINTER
自身的std::SHARED_POINTER
,这样,在发送和接收之间,线程在通常意义上没有被阻塞的地方,它就不会被忘记,即被删除。
对于阅读,我推荐使用boost::ASIO::ASYNC_READ_UNTION
,通常使用boost::ASIO::StreamBuf
。
这个1线程在循环中运行boost::asio::io_context::run
就足够了,它将在每次需要处理接收到的东西或生成要发送的新东西的许多连接中的一个时解除阻塞。
一般项目有点超出范围,如果你能缩小你的问题,或者更好地阅读会谈和例子,这将会有所帮助。 我写了一些类似于you indent,a resilient overlay Network的东西:https://github.com/superlokkus/code