在 C++ 和 Windows 中使用 XmlRpc

Posted

技术标签:

【中文标题】在 C++ 和 Windows 中使用 XmlRpc【英文标题】:Using XmlRpc in C++ and Windows 【发布时间】:2010-09-09 05:59:02 【问题描述】:

我需要在 Windows 平台上使用 C++ 中的 XmlRpc。尽管我的朋友们向我保证 XmlRpc 是一种“广泛使用的标准技术”,但可用的库并不多。事实上,我只找到了一个在 Windows 上执行此操作的库,(加上另一个声称“你必须做很多工作才能在 Windows 上编译它)。我找到的库是 Chris Morley 的“XmlRpc++”。但是,它不支持 SSL。

因此,我的问题是:我应该使用什么库?

【问题讨论】:

【参考方案1】:

XML-RPC implementations 有数十种实现,其中一些使用 C++,但大多数使用其他语言。例如,除了 XmlRpc++ 还有XML-RPC for C and C++。这是关于如何使用 XML-RPC for C 和 C++ 库的HOWTO。

XML-RPC 规范有些简单,实现您自己的 XML-RPC 客户端并不难。更不用说,还可以将现有的 C 语言 XML-RPC 实现引入您的 C++ 项目。

XML-RPC home page 也提供了很多有用的信息。

【讨论】:

“用于 C 和 C++ 的 XML-RPC”库在 Windows 上不起作用 - 我引用:“......但事实是它可能无法开箱即用在您的 Windows 系统上。”这意味着只有一个 C++ 库可以在 Windows 上运行,即 Chris Morley 的,并且它不支持 SSL。【参考方案2】:

在我编写自己的库之前,(见上文)这是我的答案:

目前,Chris Morley 的 XmlRpc++ library 是 Windows 上 C++ 的唯一公共域/LPGL XmlRpc 实现。

有几个适用于 Linux 的 C++ 实现,其中任何一个都可以很容易地移植到 Windows,但事实似乎是还没有人这样做并公开提供。此外,正如 eczamy 所说,“XML-RPC 规范有些简单,实现您自己的 XML-RPC 客户端并不难。”

我成功地使用了 Chris Morley 的库,尽管必须找到并修复很多错误。该项目的Help Forum 似乎有些活跃,但没有人修复这些错误并发布新版本。我一直在与 Chris Morley 通信,他模糊地希望发布一个新版本,他为这个 *** 问题做出了贡献(见下文/上文),他声称已经修复了大部分错误,但到目前为止他还没有发布了一个修复了许多错误的版本。最后一次发布是在 2003 年。

令我失望的是,一个被广泛支持(而且很简单!)的协议在 Windows + C++ 上的支持如此糟糕。请阅读此页面的人拿起指挥棒,例如接管 XmlRpc++ 或正确移植 Linux 实现之一。

【讨论】:

【参考方案3】:

只想注意几点:

XmlRpc++ 的 cvs 存储库中的源代码支持 OpenSSL(虽然我没有尝试过,但它是由另一个开发人员提供的)。

大多数报告的错误已在 cvs 中修复;我暂时没有linux机器,所以还没有正式发布。

XmlRpc++ 不是公共领域。它受版权保护和许可 (LGPL)。

谢谢, 克里斯·莫利

【讨论】:

【参考方案4】:

我已经编写了自己的 C++ 库。它可在 sourceforge 获得: xmlrpcc4win

我写它而不是使用 Chris Morley 的原因是:

Windows“wininet.lib”库为您提供了处理 Http 请求的所有功能,所以我宁愿使用它。结果,我只需要 1700 LOC。 “wininet.lib”,因此我的实现,支持 HTTPS Chris Morley 对 STL 容器的使用效率非常低(Chris,如果您阅读了这篇文章,请给我发邮件)。

【讨论】:

谢谢你,我要试试。我不得不承认,我很害怕 TimXmlRpc.cpp 文件中的这一部分:#define not ! #define 或 || #define 和 && 小更新,我一直在使用这个库并取得了巨大的成功,它很容易实现。强烈推荐给任何需要在 Windows 上使用 XmlRpc 的人。 @TimCooper 是否支持任何方式进行非同步 xm​​lrpc 调用? 我刚刚用 Infusionsoft 试用了 Tim 的“XmlRpc C++ for Windows”,天哪,它可以工作了!不过,必须密切关注 Infusionsoft 如何在数组中嵌套结构。 感谢分享您的库!它似乎不支持Unicode。 XML 标记中未指定编码(因此默认为 UTF8)。客户端程序必须在传递给库之前将字符串转换为 UTF8 或从 UTF8 转换。不是很方便。此外,该项目的 Release 版本无法编译。我想这不是什么大问题,因为我们只使用源代码(而不是项目)。还有 strcpy / sprintf 调用会导致缓冲区溢出。【参考方案5】:

我能够让 Tim 的 xml rpc 版本使用 https 和基本的用户名/密码身份验证。

对于认证:

1) 用户名​​和密码需要传递给 InternetConnect(...) 函数

2) 发送HttpSendRequest(...)命令前需要添加“Authorization: Basic base64encoded(user:pass)”的http请求头。

【讨论】:

你能把你修改后的源代码发给我吗?我会审查,然后放入 sourceforge 版本。您可以通过 tim@edval.com.au 与我联系

以上是关于在 C++ 和 Windows 中使用 XmlRpc的主要内容,如果未能解决你的问题,请参考以下文章

使用 C++ 在 Windows 中执行“运行”命令?

C++:从程序、Windows 和 Linux 中测量内存使用情况 [重复]

python3使用ctypes在windows中访问C和C++动态链接库函数示例

如何在 Windows 7 中使用 OpenGL、Glut 和 Visual Studio 2008 准备 C++ 项目

在 Windows 和 Linux 中运行 C++ 程序

在 Windows 7 中交叉编译 C 和 C++ 应用程序,在 linux 下使用 MinGW