【问题标题】:XMLRPCPP asynchronously handling multiple calls?XMLRPCPP 异步处理多个调用?
【发布时间】:2011-03-18 03:15:02
【问题描述】:

我有一个处理各种不同命令的远程服务器,其中一个是事件获取方法。

如果队列中列出了 1 个或多个事件可供处理,则事件获取会立即返回。如果事件队列为空,则此方法在超时几秒后才会返回。这样我就不会遇到任何 HTTP/socket 超时。一旦事件变得可用,该方法就会立即返回。这样,客户端只与服务器建立连接,而服务器不必与客户端建立任何连接。 这种事件机制运作良好。我正在使用 boost 库来处理队列、事件通知等。

这就是问题所在。当服务器阻止从事件获取方法返回时,在此期间,我无法发出任何其他命令。 在源代码 XmlRpcDispatch.cpp 中,我在“work”方法中看到了一个简单的循环,它使用阻塞调用来“select”。 好像在处理一个方法很忙时,没有处理其他请求。

问题:我没有看到什么,XmlRpcpp (xmlrpc++) 可以异步处理多个请求吗?有谁知道用于 C++ 的更好的 xmlrpc 库?我不认为 Boost 库有一个组件可以让我发出远程命令? 我实际上并不关心 XML 或 over-HTTP 功能。我只需要通过 TCP 以任何形式或形式发出(异步)命令吗? 我期待任何人提供的任何意见。

【问题讨论】:

    标签: c++ sockets tcp xml-rpc


    【解决方案1】:

    我在使用 XMLRPC 时也遇到了一些问题,并研究了许多解决方案,例如 GSoap 和 XMLRPC++,但最后我放弃了,并使用 Boost.ASIOTinyXML++ 从头开始​​编写了整个 HTTP+XMLRPC(后来我将 TinyXML 换成了expat)。真的没有那么多工作。我自己在大约一周内完成了这项工作,从头开始,最终实现了许多 RPC 调用。

    Boost.ASIO 给出了很好的结果。顾名思义,它是完全异步的,并且具有出色的性能和很少的开销,这对我来说非常很重要,因为它运行在嵌入式环境 (MIPS) 中。

    后来,这可能是你的情况,我将 XML 更改为Google's Protocol-buffers,并且更开心。它的 API 以及它的消息容器都是类型安全的(即你发送一个 int 和一个浮点数,它永远不会像 XML 那样被转换为字符串和返回),一旦你掌握了它,这并不需要很长时间,它非常有成效的解决方案。

    我的建议:如果您可以放弃 XML,请使用 Boost.ASIO + Protobuf
    如果您需要 XML:Boost.ASIO + Expat

    从头开始做这些事情真的值得。

    【讨论】:

    • 我正在考虑使用boost的asio。我希望我可以从 C++ 端将整数和字符串写入流,并使用 DataInputStream 读取在 Java 端接收它。
    • @Mike 那么我强烈建议使用 XML 或 protobuf;因为这样做时可能会遇到一些问题,他们都会为您解决这个问题。
    • @Gianni。遇到asio问题。我有一个事件队列,当它为空时,当使用套接字通信进行查询时,在返回之前等待一段时间并报告队列为空,或者在偶数可用时唤醒并报告队列的内容。所以客户端有两个到服务器的连接。一个用于发布指令,另一个用于获取(等待)事件。问题是当使用 asio 时,当一个会话在等待时,另一个会话不接受任何命令。所以换句话说,一个会话占用另一个会话。异步就这么多?
    • @Mike 好吧,它仍然是异步的,只是在你的情况下你需要两个 ASIO 队列,或者boost::asio::io_service。只需这样做:为您拥有的每个 io_service 套接字创建一个新的。它应该像听起来一样微不足道并解决您的问题。
    • @Gianni。好的,在无休止的闲逛并且在任何地方都没有找到任何明确的文档之后,我在新套接字上启动线程时一无所获。然后我发现了这个:stackoverflow.com/questions/1982595/… 然后我发现这个 io_service 是一个工作任务,它试图在找到它的时候开始工作,在某种程度上你可以通过从创建的工作线程调用 run 来让多个线程调用工作。因此,我没有按需创建线程(我想这也是可能的),而是创建了两个线程,每个调用都在一个 io_service 上运行。
    猜你喜欢
    • 2015-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-02
    • 2019-05-12
    • 1970-01-01
    相关资源
    最近更新 更多