我试图编写一个RFC 2812兼容的C++ IRC库。 我在客户端本身的设计上遇到了一些麻烦。 从我读到的IRC通信往往是异步的。我使用boost::asio::async_read
和boost::asio::async_write
。 通过阅读我收集的文档,您无法在完成一个async_write请求之前执行多个async_write请求。因此,你最终会得到相当嵌套的回调。这不是打败了做异步调用的目的吗?使用同步调用来防止嵌套会不会更好?如果不是,为什么?其次,如果我没有弄错,每个boost::asio::async_write
后跟一个boost::asio::async_read
来接收服务器对发送命令的响应。因此,我的客户端的函数需要一个回调参数,以便在客户端收到响应后(例如发送另一个消息...),该类的用户可以执行某些操作。C++ IRC客户端设计
如果我要继续使用异步来实现此操作,我应该保留一个std::deque<std::tuple<message, callback>>
并且每次boost::asio::async_write
完成,并且队列中有一个元组,并且出队并发送消息,然后引发回调?这是实现这个系统的最佳方式吗?
我在想,因为消息一直在发送,所以我将不得不实现某种侦听器循环来排队响应,但是如何将这些响应与触发它们的特定命令关联?或者在这种情况下,响应只是来自另一个用户的信道消息?
所以你说我应该有一两个'的std :: deque的<性病::组<消息,回调>>'和一个'的std :: deque的<性病::组<回复,回调>>' ? 另外我应该产生一个线程来阻塞和不断阅读,并填写答复队列?或者,递归调用async_read? 更新状态是什么意思 - 你能举个例子吗? 至于whois或ping命令,我可以在接收到特定回复(如这些回复)时“挂钩”发送特定消息的例程。 –
@FranciscoAguilera IRC协议本质上是异步的,所以我不会建议阻止调用。该协议也不是特定于何时需要发送对命令的回复,并且一些服务器实现可能不发送回应。我认为通过事件来处理服务器命令会更加健壮(例如,当接收到“JOIN”命令时调用'on_join'),而不是尝试管理如此接近协议层的回调(客户端可能会收到'JOIN'不响应客户端发送的“JOIN”命令的命令)。 –
对,但你如何建议我收到这些命令?我需要调用async_read,不是吗?我应该循环调用async_read从它的回调检查数据读取整个客户端? –