点击打开链接

有关libeva的使用说明 - 登录和登出操作

首先,需要简单说一下腾讯QQ2005beta1的登录过程。

第一步。向服务器索要登录令牌, 对应的libeva的封装类为RequestLoginTokenPacket
第二步。得到登录令牌后, 则尝试登录一个腾讯服务器。 登录包的对应封装为 LoginPacket
第三步。如果服务器返回的是, 登录回应包的封装为 LoginReplyPacket
   3。1 QQ_LOGIN_REPLY_OK(0x00): 则说明登录成功
   3。2 QQ_LOGIN_REPLY_REDIRECT(0x01):说明服务器要求你更改新的服务器重新登录
   3。3 QQ_LOGIN_REPLY_PWD_ERROR(0x05):你的密码错误
   3。4 其他未知码: 意义不大了,其实我们只要上面三种情况就够了

现在,给出一个大概的编码逻辑,  这里还是假定网络部分已经实现

这里假定一个方法叫做send(OutPacket *p),是发送数据包的。内容大体如下
[code:1]
void send(OutPacket *p){
    char *data = new char[MAX_PACKET_SIZE];
    int len = MAX_PACKET_SIZE;
    
    p.fill(data, &len);
    
    doSend(data, len); // 这里换成你发送数据的方法
    
    delete []data;
    delete p;  // 注意如果p在之外还要用,就不要删了
}
[/code:1]
在用户输入用户名和密码以后,我们需要首先设置libeva中Packet的QQ号,
和密码密钥(password key,就是对密码做2次md5后的字串, 细节可以参考“libeva使用说明-发送和接收”文档)
假如用户的 QQ号为12345, 密码为11111, 那么密码密钥就是d545c63da029385e7f46806156f8f51d,
我们假设密码密钥在一个char型的数组md5Pwd中,数组长度为16(注意密码密钥长度总是16)。
[code:1]
Packet::setQQ(12345); // 设置QQ号
Packet::setPasswordKey(md5Pwd); // 设置密码密钥
Packet::setUDP(true); // 这里设置是UDP登录。 参数为false就是TCP登录
[/code:1]

完成了这些准备工作,我们就可以请求登录令牌了
[code:1]
RequestLoginTokenPacket *packet = new RequestLoginTokenPacket();
send(packet);
[/code:1]

这里说明一下,有关接收数据和判断数据的类型,在“libeva使用说明-发送和接收”
中已经说明,就不再重复了。

这里假定分析登录令牌的回复方法如下
[code:1]
void processRequestLoginTokenReply(const InPacket *in)
{
        RequestLoginTokenReplyPacket *packet = new RequestLoginTokenReplyPacket();
        packet->setInPacket(in);
        packet->parse(); // 解析一下就可以了, 这个类会自动设置好loginToken
        delete packet;   // 释放点内存,这是个好习惯
        
        doLogin();  // OK, 有了登录令牌,我们就可以登录了。
}
[/code:1]
[code:1]
void doLogin()
{
    send(new LoginPacket(QQ_LOGIN_MODE_NORMAL));  // 这就足够了, 够简单吧, 要是隐身登录,
                                                  // 参数换成QQ_LOGIN_MODE_INVISIBLE 就OK了
}
[/code:1]

现在我们来看看登录回应包的处理,
[code:1]
void processLoginReply(const InPacket *in)
{
        LoginReplyPacket *packet = new LoginReplyPacket();
        packet->setInPacket(in);
        if(!packet->parse()) {         // 我也不清楚是什么原因,有时候会出现解析失败,也许是网络的原因                               
                printf("parse error\n");  // 但是大家放心, 总会正确的, 多检查一下总是好的,^_^
                return;
        }
        switch(packet->getReplyCode())
        {
        case QQ_LOGIN_REPLY_OK:
                // 到这里的话,那就是登录成功, 恭喜你!
                break;
        case QQ_LOGIN_REPLY_REDIRECT:
                // 如果到这里,说明服务器要求你转到其他服务器登录
                // 登录服务器的IP通过 packet->getRedirectedIP() 来得到,
                //             这个IP是个以本地字节序排列在一个int里(4字节)
                // 服务器的端口通过 packet->getRedirectedPort() 来得到,
                //             这个就是一个short型, 16字节
                break;
        case QQ_LOGIN_REPLY_PWD_ERROR:
                // 如果到这里则,说明你密码错误,而且服务器会返回一个“密码错误”之类
                // 的字符串, 你可以printf出来, 注意所以服务器的字符串编码,如果没有
                // 特殊说明,都是GB编码, GBK, GB18030 都可以
                printf("password error:%s\n",packet->getReplyMessage().c_str());
                break;
        default:
                // 我还没有见过到这里的, 你要是到了这里,还请告诉我, ^_^
                printf("unknown reply code\n");
        }
}
[/code:1]

登录上了不是就完事了, 大概没隔1分钟,还是要向腾讯汇报一下,你还“活着”,否则,
腾讯服务器就不理你了,呵呵
[code:1]
   send(new KeepAlivePacket()); // 这样就可以了, easy?
[/code:1]

对于上面的保持在线的回应包,没有多大用处, 里面就是目前腾讯服务器在线总人数,什么的。
[code:1]
void processKeepAliveReply( const InPacket * in )
{
        KeepAliveReplyPacket *packet = new KeepAliveReplyPacket();
        packet->setInPacket(in);
        packet->parse(); // 以上三步都是固定套路, 也许,我以后把这个写到一个方法里
        numOnlineUsers = packet->numOnlineUsers(); // 通过这个方法就可以得到当前在线总人数了
}
[/code:1]

最后再说一下登出操作, 最简单就是这个了, 登出操作时,腾讯服务器是不会
回复的,只要扔4个一样的登出包给服务器就搞定了
[code:1]
        for(int i=0; i<4; i++)
                send(new LogoutPacket());

// 现在已经登出腾讯服务器了,我们需要清理整个登录和会话
        // 过程中用到的所有的Key
        Packet::clearAllKeys();
[/code:1]

ok, 总算说差不多了,现在大家,可以自己写一个简单地客户端了吧,呵呵
大家好运。^_^

最后    再补充一下, 大家需要用eva 0.3.0 pre版中的 libeva 才行, 否则,
不灵的,呵呵, 就是登录的时候直接登就可以了,不需要什么登录令牌。

eva 0.3.0 pre 在这里去找把

转载于:https://www.cnblogs.com/Podevor/archive/2011/10/07/2788024.html

有关libeva的使用说明 - 登录和登出操作相关推荐

  1. 命令行客户端MySQL基本命令的使用(登录、登出、数据库操作的SQL语句、表结构的SQL语句、表数据操作的SQL语句)

    1. 登录和登出数据库 登录数据库: 输入下面命令: mysql -uroot -p 说明: -u 后面是登录的用户名  [写成-u root也是可以的] -p 后面是登录密码, 如果不填写, 回车之 ...

  2. 通过session实现用户的登录与登出功能

    通过session实现用户的登录与登出功能 本文讲解,就是在常见的登录注册页面中,我们是如何在登录之后,把用户的信息传送到后面的网页. 首先讲解原理,原理是session功能,通过session的在当 ...

  3. 9_用户的登录和登出

    用户的登录和登出 之前我们已经讲到,项目到现在,我们一共建立了两个app,分别是article和bloguser. 登录 1. 配置根路由 打开iblog/urls.py path('bloguser ...

  4. 基于Jsoup实现搜狗微信搜索文章获取链接、搜索公众号信息、微信登录以及登出

    2020-03-20更新 已上传至GitHub:https://github.com/Aquarius-Seven/demo-jsoup.git,相比CSDN资源,CommonUtil增加了一个处理需 ...

  5. 前端实现登录、登出、请求数据的一些思路整理

    前端实现登录.登出.请求数据的一些思路整理(基于React.JWT技术) 登录.登出和数据请求是两种不同的数据交互方式,是互相独立的. 登录.登出基于 JWT(JSON WEB TOKEN) 技术,通 ...

  6. tp5登出_tp 5框架实现登录,登出及session登录状态检测功能示例

    本文实例讲述了tp 5框架实现登录,登出及session登录状态检测功能.共享给大家供大家参考,详细如下: 1,访问http://localhost/tp5/admin.php时,判断有没有登录: 想 ...

  7. cas client 更新ticket_cas sso单点登录系列6_cas单点登录防止登出退出后刷新后退ticket失效报500错...

    转(http://blog.csdn.net/ae6623/article/details/9494601) 问题: 我登录了client2,又登录了client3,现在我把client2退出了,在c ...

  8. 从零开始搭建服务器之登录和登出远程服务器

    双 11 期间入手了一台云服务器,备案花了一两个星期,这两天终于备案通过了.于是在个人服务器上装了 Docker 容器用于部署项目,准备尽量把所有的服务都打包成容器,方便统一管理运维. 于是利用 do ...

  9. cas5.3.2单点登录-单点登出(十一)

    原文地址,转载请注明出处: https://blog.csdn.net/qq_34021712/article/details/81515317     ©王赛超  既然有单点登录,肯定就要有登出,之 ...

  10. Spring Security OAuth2 单点登录和登出

    文章目录 1. 单点登录 1.1 使用内存保存客户端和用户信息 1.1.1 认证中心 auth-server 1.1.2 子系统 service-1 1.1.3 测试 1.2 使用数据库保存客户端和用 ...

最新文章

  1. 推荐本人微博及浅谈发博原则
  2. Nessus扫描器的使用
  3. 坐地铁的好心MM们小心啊,周末刚经历了一个地铁新骗术
  4. SpringBoot项目的 pom.xml第一行报错
  5. bash:express:command not found
  6. IAR 的精确延时程序(转)
  7. Learning opencv续不足(七)线图像的设计D
  8. 人力节省 50%,研发效能提升 40%,阿里 Serverless 架构落地实践
  9. css hack 尽我所见
  10. java 事件分发机制_读Android源码之事件分发机制最全总结
  11. DDD实战进阶第一波(一):开发一般业务的大健康行业直销系统(概述)
  12. Google Chrome 所有版本下载
  13. 激光计算机论文,激光技术论文(2)
  14. 全自动抠图换背景软件下载_智能抠图换背景软件-手挥自动背景更换软件
  15. 中国SaaS产品成功四要素和四层次
  16. 10句话快速提高项目经理的领导力
  17. 海贼王燃烧意志服务器维修,海贼王燃烧意志刷经验
  18. android内置sd卡挂载过程,Android获取机身存储、内置SD卡与外置TF卡路径
  19. pjsip学习 ------ 三
  20. [笨木头FireFly 03]完整的服务端和客户端通信

热门文章

  1. java中的轻重量级组件_java Swing AWT 轻量级组建 和 重量级组件
  2. java 浅堆 深堆_【深入浅出-JVM】(57):深堆、浅堆
  3. python 函数重载_python中有函数重载吗
  4. python安装后怎样配解释器_入门Python第一步:如何安装Python解释器「新手必看」...
  5. 实现Eureka注册发现的高可用
  6. Easy UI combobox实现类似 Select2的效果,下拉带搜索框
  7. JS 100内与7相关的数
  8. 用《内网穿山甲》共享内网中的远程桌面服务
  9. Set,Map数据结构
  10. 项目--Asp.net全局变量的设置和读(web.config 和 Gloab)