QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

楼主: yunfan

Eva开发文档1 ---------- libeva 类描述

[复制链接]
 楼主| 发表于 2005-1-7 12:38:28 | 显示全部楼层
一个重要的更正, 是我的错误所致, 可能在有些系统上不能编译,会有如下编译错误
evapacket.cpp: In member function `int OutPacket::putHead(unsigned char*)':
evapacket.cpp:33: error: `int Packet::qqNum' is private
evapacket.cpp:238: error: within this context


如果出现这个问题,请大家做如下更改:
把 evapacket.cpp 文件的 238 行:
int id = htonl(qqNum);

改为
int id = htonl(getQQ());

这个错误的原因是
int qqNum 是 Packet 类的私有变量
而我在它的继承类OutPacket里调用了这个变量,只应该是不可以的,但是不知道
为什么我的编译器没有报错。

而本来我是把qqNum 放在 protected: 里的, 继承类是可以访问的, 后来改掉了。


多谢Jacky Gu <[email protected]> 给我的反馈
给大家带来的不便望,大家包含
回复

使用道具 举报

发表于 2005-1-9 20:14:28 | 显示全部楼层
在看代码的时候发现在kdevelep中看中文注释是乱码后来没辙跑到kwrite里看才基本正常但仍然有乱码.其他人有遇到么?????
"/** 这是文件传输时的数据消息包开头字芄17*/"
回复

使用道具 举报

 楼主| 发表于 2005-1-9 20:56:47 | 显示全部楼层
[quote:443e23ca20="llemmx"]在看代码的时候发现在kdevelep中看中文注释是乱码后来没辙跑到kwrite里看才基本正常但仍然有乱码.其他人有遇到么?????
"/** 这是文件传输时的数据消息包开头字芄17*/"[/quote]

新版除了 evadefines.h里有中文,其他文件都是英文得,不应该有乱码。
如果出现乱码, 用UTF8编码看。 我都是用UTF8存得。

另,以前版本改lumaqq的, 很乱,个别可能会有乱码, 那些基本都是lumaqq里的注释,我拷过来了, 内码转换的时候可能有点问题。希望还是主要看现在的测试版里的文件,可以参考以前的。
回复

使用道具 举报

发表于 2005-1-9 21:34:45 | 显示全部楼层
今晚总算腾出时间来仔细研究代码了.后面会贴一些代码的修改建议.
source file name:evapacket.cpp
Line:46
Packet:acket(unsigned char *buf, int *len)
{
        int pos;
        // if it's not UDP, must be TCP
        if(!mIsUDP)       
                pos = 3;
        else
                pos = 1;
       
        version = buf[pos]*0x100+buf[++pos];
        command = buf[++pos]*0x100+buf[++pos];
        sequence = buf[++pos]*0x100+buf[++pos];
       
        (*len)=(*len)-pos;
        memcpy(buf, buf+pos, *len);
}
回复

使用道具 举报

 楼主| 发表于 2005-1-9 22:06:34 | 显示全部楼层
[quote:a90b8d4336="llemmx"]今晚总算腾出时间来仔细研究代码了.后面会贴一些代码的修改建议.
source file name:evapacket.cpp
Line:46
Packet:acket(unsigned char *buf, int *len)
{
        int pos;
        // if it's not UDP, must be TCP
        if(!mIsUDP)       
                pos = 3;
        else
                pos = 1;
       
        version = buf[pos]*0x100+buf[++pos];
        command = buf[++pos]*0x100+buf[++pos];
        sequence = buf[++pos]*0x100+buf[++pos];
       
        (*len)=(*len)-pos;
        memcpy(buf, buf+pos, *len);
}[/quote]

不错,不错,提的好,我说一下我的想法啊。

我考虑,这种方法不如直接位操作快,以前我是位操作的,
但后来觉得因为大家的系统不一样,字节序也可能不一样
(就是big endian和little endian的问题), 为了避免这样的问题
就用了ntol/ntos函数族, 腾讯协议里凡是int,short的发过来都是
big endian的, 这样可以保证字节序最大程度不出错。

这个问题大家可以讨论,讨论
回复

使用道具 举报

发表于 2005-1-9 22:07:09 | 显示全部楼层
看来我还得翻翻lumaqq的代码了,这里发现在evapacket.cpp 中分配内存使用了malloc很奇怪哦,既然是cpp为啥不用new??还有这里fprintf函数是否是用来在控制台上显示错误信息的?(我不是特别清楚)如果是的话我记得该函数有缓存溢出的可能.(我希望代码能更坚固一些^0^)
source file name:evapacket.cpp
Line:217
int OutPacket::putHead(unsigned char *buf)
{
        int pos=0;
        if(!isUDP()){
                buf[0]=buf[1]=0;
                pos+=2;
        }
        buf[pos++]=(unsigned char)QQ_PACKET_TAG;
       
        buf[pos]   = (version >> sizeof(unsigned char)) & 0xFF;
        buf[++pos] = version & 0xff;
       
        buf[++pos] = (command >> sizeof(unsigned char)) & 0xFF;
        buf[++pos] = command & 0xff;

        buf[++pos] = (sequence >> sizeof(unsigned char)) & 0xFF;
        buf[++pos] = sequence & 0xff;
       
        int id = htonl(getQQ());
        memcpy(buf+pos, &id, 4);
        pos+=4;
               
        return pos;
}
回复

使用道具 举报

发表于 2005-1-9 22:18:11 | 显示全部楼层
[quote:31eaf4613e="yunfan"]

不错,不错,提的好,我说一下我的想法啊。

我考虑,这种方法不如直接位操作快,以前我是位操作的,
但后来觉得因为大家的系统不一样,字节序也可能不一样
(就是big endian和little endian的问题), 为了避免这样的问题
就用了ntol/ntos函数族, 腾讯协议里凡是int,short的发过来都是
big endian的, 这样可以保证字节序最大程度不出错。

这个问题大家可以讨论,讨论 [/quote]
也就是说QQ里协议传输时都是顺序字节传输的是吧.
其实我这样处理一般只适合32位机器,我们是否在网上声明eva是for x86的32位软件呢?因为我看见我们在代码上好象不支持64或16位系统哦.
回复

使用道具 举报

 楼主| 发表于 2005-1-9 22:28:15 | 显示全部楼层
[quote:dc115896c6="llemmx"]
也就是说QQ里协议传输时都是顺序字节传输的是吧.
其实我这样处理一般只适合32位机器,我们是否在网上声明eva是for x86的32位软件呢?因为我看见我们在代码上好象不支持64或16位系统哦.[/quote]

这个我不知道, 你是否说32位的系统都是这种逆字节序的?
回复

使用道具 举报

发表于 2005-1-9 22:33:34 | 显示全部楼层
哦对了,我们在解析协议时能否能使用先解析在使用的方法呢?就是说我们将协议描述成一个一个的struct
每个协议来到时我们先将数据解包到这些struct中
在解析的过程中可以对这些数据进行合法性检查.成功了在正真使用这些数据,可能会慢点但是应该安全.我在公司里与那些个单片机的实时操作系统通讯时都用的这方法.
例如:
02 03 04 05 06 BB
假如这里我们的0203,0405,06BB在单片机中表示整形
那么我们pc机的结构体可以定义成
struct{
    int nVar1;
    int nVar2;
    int nVar3;
}ss;
缓冲区的名称为buf
解析
ss.nVar1=buf[0]*0x100+buf[1];
...
如果这个包没有任何问题我们将直接提交结构体处理.(这里是c的例子如果是c++的话那么就可以用类来代替结构体那么直接提交的是类)
我是不是太唠叨了
回复

使用道具 举报

发表于 2005-1-9 22:34:36 | 显示全部楼层
不,只要是x86系统的pc机都这样从16为到64位均如此
回复

使用道具 举报

发表于 2005-1-9 22:38:34 | 显示全部楼层
可能是个人编程的毛病.由于本人老写服务器所以对代码的细节注意太多了.所以大家看了以后做参考就可以了,最好还是考虑当前的环境在定.别给细节打倒了.
回复

使用道具 举报

 楼主| 发表于 2005-1-9 22:50:06 | 显示全部楼层
[quote:8843325cae="llemmx"]哦对了,我们在解析协议时能否能使用先解析在使用的方法呢?就是说我们将协议描述成一个一个的struct
每个协议来到时我们先将数据解包到这些struct中
在解析的过程中可以对这些数据进行合法性检查.成功了在正真使用这些数据,可能会慢点但是应该安全.我在公司里与那些个单片机的实时操作系统通讯时都用的这方法.
例如:
02 03 04 05 06 BB
假如这里我们的0203,0405,06BB在单片机中表示整形
那么我们pc机的结构体可以定义成
struct{
    int nVar1;
    int nVar2;
    int nVar3;
}ss;
缓冲区的名称为buf
解析
ss.nVar1=buf[0]*0x100+buf[1];
...
如果这个包没有任何问题我们将直接提交结构体处理.(这里是c的例子如果是c++的话那么就可以用类来代替结构体那么直接提交的是类)
我是不是太唠叨了 [/quote]

, 不唠叨。
你再看看我程序的结构, 把你的想法再具体一点, 我也考虑这样可能会出现
解析问题, 但是我使用中没有发现出过问题。另外,因为我知道接收到了多少
个字节,字节不符条件,就不解析了,我考虑在父类Packet里加一个标识解析出错的变量, 用解析过的包的时候先看是否出错。

你再考虑一下你上面的想法,把它落实到Eva上,开发人员再一起探讨一下,
如果可行,我们下一版就改掉,这一版先这么做出来,再完善它。

呵呵,慢一点没关系, 数据有没有多少, c++的也慢不到那里去的。
不会有明显的感觉的。
回复

使用道具 举报

 楼主| 发表于 2005-1-9 22:59:03 | 显示全部楼层
[quote:8e977fdf88="llemmx"]可能是个人编程的毛病.由于本人老写服务器所以对代码的细节注意太多了.所以大家看了以后做参考就可以了,最好还是考虑当前的环境在定.别给细节打倒了.[/quote]

对技术上的东西,就该精益求精  :D
回复

使用道具 举报

发表于 2008-3-9 15:16:22 | 显示全部楼层
刚来的。

有没有完整的开发说明,虽说我底层的数据传输现在还不是很了解。

但是我可以重新写一个结构,改善一下外观和功能啊。

请版主把信息发送到[email protected]
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-4-17 05:45 , Processed in 0.102909 second(s), 13 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表