c++ - 64 位 libjingle 无法解析登录 XML 并出现 expat 错误 : ERROR_INVALID_TOKEN

标签 c++ xml xmpp libjingle expat-parser

仅在尝试在 64 位 下运行我的登录代码时,我是否无法登录 talk.google.com对于我的初步测试。 32 位工作正常。

启用日志记录宏和 siginput 日志记录后,我可以看到它失败的 XML 是这样的:

<stream:stream from="gmail.com" id="3D9A4487B8514DE2" version="1.0" xmlns:stream="http://etherx.jabber.org/streams" xmlns="jabber:client">\232\231\377

在 expat 内部,我可以看到有一个 XML_ERROR_INVALID_TOKEN 被抛出,但我不太确定从那里去哪里。有时它会进入实际登录,但不久后就会死掉。它似乎是相对随机的,但总是在前 10 个左右的响应中死亡。我认识到最后的垃圾数据可能是导致无效 token 的原因,但我不确定是什么原因导致的。

我最初的想法是切换到 64 位 时的编码问题 (??),但老实说,我只是不知道什么会导致这样的事情发生。

这是来自 libjingle 死机的日志中的另一个示例片段:

137[000:568] RECV <<<<<<<<<<<<<<<<<<<<<<<<< : Thu Feb 21 00:01:31 2013
[000:568]    \332
[000:568]    <iq id="2" type="result">
[000:568]      <bind xmlns="urn:ietf:params:xml:ns:xmpp-bind">
[000:568]        <jid>
[000:568]          snip@gmail.com/CD6FF
[000:568]        </jid>
[000:568]      </bind>
[000:568]    </iq>
<iq id="2" type="result"><bind xmlns="urn:ietf:params:xml:ns:xmpp-bind"><jid>snip@gmail.com/CD6FF</jid></bind></iq>x\332Mhanism>X-OAUTH2</mechanism></mechanisms></stream:features>p

还有一个:

[000:217]    <stream:stream from="gmail.com" id="2462F624C942" version="1.0" xmlns:stream="http://etherx.jabber.org/streams" xmlns="jabber:client">
<stream:stream from="gmail.com" id="246E4B24C942" version="1.0" xmlns:stream="http://etherx.jabber.org/streams" xmlns="jabber:client">\225\231\377

另一个:

139[000:178] RECV <<<<<<<<<<<<<<<<<<<<<<<<< : Thu Feb 21 00:20:52 2013
[000:178]    <stream:stream from="gmail.com" id="B15C99514B664586" version="1.0" xmlns:stream="http://etherx.jabber.org/streams" xmlns="jabber:client">
<stream:stream from="gmail.com" id="B15C99514B664586" version="1.0" xmlns:stream="http://etherx.jabber.org/streams" xmlns="jabber:client">\366\231\377

另一个:

52[000:243] RECV <<<<<<<<<<<<<<<<<<<<<<<<< : Thu Feb 21 00:23:44 2013
[000:243]    Q
[000:243]    <success xmlns="urn:ietf:params:xml:ns:xmpp-sasl"/>
<success xmlns="urn:ietf:params:xml:ns:xmpp-sasl"/>\261xml:ns:xmpp-sasl"><mechanism>PLAIN</mechanism><mechanism>X-GOOGLE-TOKEN</mechanism><mechanism>X-OAUTH2</mechanism></mechanisms></stream:features>Q

以前有人遇到过此类问题吗?

最佳答案

假设\ddd序列表示八进制数,您的流包含无效 utf-8 中的代码点,这可能是 xml 数据流的默认预期编码。

在将内容提供给 xml 解析器之前,您必须用数字实体替换有问题的字节,例如\231 -> &#x99; .

另一种选择可能是在您的 xml 数据流前加上一个 xml 序言,声明一些 8 位字符集,例如。 <?xml version="1.0" encoding="iso-8859-1" ?> .

希望对你有帮助,问候

关于c++ - 64 位 libjingle 无法解析登录 XML 并出现 expat 错误 : ERROR_INVALID_TOKEN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14997586/

相关文章:

c++ - 在哪里可以找到构建高级语言控制流的(解释器的)代码示例? (如果/否则,同时)

C++微软的ComPtr和c++的unique_ptr、shared_ptr有什么区别?

内部类的 C++ vector

python - 如何在 Linux 系统上使用 SyntaxNet 输出来操作执行命令,例如将文件保存在文件夹中

Android 资源编译失败(非转义字符)- 即使我修复了错误

xml - 如何通过 PowerShell 从 xml 中获取值?

ios - Iphone-发生事件时从服务器通知客户端

c++ - 单元测试和 boost::asio

c++ - 当我尝试对数组的内容使用函数时,控制台中没有任何显示

ios - 如何在ejabberd中设置用户密码?