前段时间研究gloox1.0版的注册,用官方自带的example,注册应该是很简单的例子,代码如下:
1: j = new Client( "pc-20110409pvwc" );
2: j->disableRoster();
3: j->registerConnectionListener( this );
4:
5: m_reg = new Registration( j );
6: m_reg->registerRegistrationHandler( this );
7:
8: j->logInstance().registerLogHandler( LogLevelDebug, LogAreaAll, this );
9:
10: j->connect();
11:
12: delete( m_reg );
13: delete( j );
但是我用自带的register_example编程成功后运行,在最后一步提交注册信息后返回如下的结果:
“bad-request”。。。仔细看返回的结果,在gloox1.0版本,在register_example运行时候,有Sasl验证过程,跟代码发现进行的是匿名验证。但是我记得在之前0.99版本都不会有验证的过程呀!于是我考虑在注册的时候像之前的版本那样禁用掉Sasl验证,禁用过程用Client::setForceNonSasl函数,代码如下:
1: j = new Client( "pc-20110409pvwc" );
2: j->disableRoster();
3: j->setForceNonSasl();
4: j->registerConnectionListener( this );
5:
6: m_reg = new Registration( j );
7: m_reg->registerRegistrationHandler( this );
8:
9: j->logInstance().registerLogHandler( LogLevelDebug, LogAreaAll, this );
10:
11: j->connect();
12:
13: delete( m_reg );
14: delete( j );
修改后运行发现居然还要进行Sasl验证过程,单步调试发现setForceNonSasl没有起作用,找到匿名验证验证的代码处,在Client::handleNormalNode函数中,截取代码段:
1: else if( !m_clientCerts.empty() && !m_clientKey.empty()
2: && m_streamFeatures & SaslMechExternal && m_availableSaslMechs & SaslMechExternal )
3: {
4: notifyStreamEvent( StreamEventAuthentication );
5: startSASL( SaslMechExternal );
6: }
7: #if defined( _WIN32 ) && !defined( __SYMBIAN32__ )
8: else if( m_streamFeatures & SaslMechGssapi && m_availableSaslMechs & SaslMechGssapi )
9: {
10: notifyStreamEvent( StreamEventAuthentication );
11: startSASL( SaslMechGssapi );
12: }
13: else if( m_streamFeatures & SaslMechNTLM && m_availableSaslMechs & SaslMechNTLM )
14: {
15: notifyStreamEvent( StreamEventAuthentication );
16: startSASL( SaslMechNTLM );
17: }
18: #endif
19: else if( m_streamFeatures & SaslMechAnonymous
20: && m_availableSaslMechs & SaslMechAnonymous )
21: {
22: notifyStreamEvent( StreamEventAuthentication );
23: startSASL( SaslMechAnonymous );
24: }
25: else
26: {
27: notifyStreamEvent( StreamEventFinished );
28: connected();
29: }
匿名验证是在倒数第二段,于是在它的if判断语句加上检测是否禁止验证如下
else if( !m_forceNonSasl && m_streamFeatures & SaslMechAnonymous
&& m_availableSaslMechs & SaslMechAnonymous )
保存重新编译,这样就可以不用进行匿名验证,实现正常的注册了。
我对gloox1.0理解还很浅,如果哪位知道register_example为什么会运行失败的真正原因,麻烦说明一下!
分享到:
相关推荐
gloox 是一个C++的类库,用以实现可移植的 Jabber/XMPP 协议。gloox 完全兼容 XMPP RFCs,支持所有的 XMPP 特性,包括 SRV lookups, TLS, SASL, roster management, and privacy lists,同时实现了许多 XEPs 协议...
gloox-1.0-beta5,c++源码,跨平台的开源类,广泛应用于gtalk,qq。支持android和ios。
一、对Gloox1.0添加了操作接口(.def),实现收发信息,可以发送中文。 二、开发环境:VC2008、Openfire、WinXP。 说明: 1、此代码是项目中正在使用的代码,如有不妥请指教。... 问题,不理解,请给出详细错误信息。
GLOOX1.0官方API文档,DOXYGEN生成。GLOOX开发XMPP必备。 整理后CHM
即时通讯相关的非常好的参考源码,基本全部都测试通过。
Gloox1.0 二次开发,添加了操作接口(.def),实现收发信息,可以发送中文。
通常在客户端与服务器之间需要心跳来维系连接,XMPP可以通过一个扩展协议...XEP-0199规定通过发送命名空间为'urn:xmpp:ping'的iq节XML流来解决这个问题。本文代码为测试代码…… 本文阐述GLOOX客户端对服务器消息的封装
gloox 是一个使用 C++ 实现的 Jabber/XMPP 的底层库(非界面),它使开发XMPP/JABBER客户端更为简单,并且可以让各种程序方便的嵌入XMPP的支持。它使用 GNU GPL 授权,也支持商业授权 0.9版主要支持以下功能 - full ...
GLOOX1.0官方API文档,DOXYGEN生成。GLOOX开发XMPP必备。
著名的xmpp服务器开发包,可用于通信软件的二次开发
移动设备与PC设备直接通讯,能够实现同步,上传,下载
这是gloox-1.0.17源码,用VS2013编译成功。找到源码里的gloox.sln文件,用VS2013打开,重新编译后,生成gloox-1.0.17.dll
目前做了一些IM的程序,这是gloox注册例子
XMPP开源实现 open source implement (C/C++)
该开发包由Visual C++ 6.0 和Microsoft Platform...4 sys-dll文件夹中是gloox.dll所依赖的库,考虑到有些开发环境的SDK比较老,没有这几个库文件,所以一并放在这里 该SDK可在Visual C++ 6.0及比它高级的开发环境中使用
关于gloox的文件传输的参考代码,我去掉了一些业务方面的代码,这些代码只能做参考。
gloox源代码,可以用来实现xmpp客户端。功能强大
gloox库代码分析和源码,gloox库代码分析和源码gloox库代码分析和源码
gloox-1.0.20-api Documentation 最新版的api文档,详细解释 GLOOX1.0.20官方API文档,DOXYGEN生成。GLOOX开发XMPP必备。
gloox 登录,仅供参考(要使用,请先编译gloox库)