BoyFriend 发表于 2005-10-10 05:05:40

Eva-3.2.0在64位系统下还是不能登录

新装的Mandriva 2006 x86_64版本还是有网络问题,仍然不能登陆。

UDP登录:
Got server :61.144.238.155
EvaUHProfile::loadProfile -- file not exists
password key set!
packet exception: (cmd)0x62
packet exception -- commend code: 0x62
OutPacket->encryptBody: sessionkey not set yet, set encrypted length to 0
OutPacket->encryptBody: sessionkey not set yet, set encrypted length to 0
OutPacket->encryptBody: sessionkey not set yet, set encrypted length to 0
OutPacket->encryptBody: sessionkey not set yet, set encrypted length to 0

TCP登录:
Got server :219.133.38.230
EvaUHProfile::loadProfile -- file not exists
connecting to "219.133.38.230"
password key set!
got login token
login token set!
password key set!
packet exception: (cmd)0x22
packet exception -- commend code: 0x22
OutPacket->encryptBody: sessionkey not set yet, set encrypted length to 0
OutPacket->encryptBody: sessionkey not set yet, set encrypted length to 0
OutPacket->encryptBody: sessionkey not set yet, set encrypted length to 0
OutPacket->encryptBody: sessionkey not set yet, set encrypted length to 0

BoyFriend 发表于 2005-10-10 05:09:24

包是在Mandriva cooker里找的打过补丁的包。

yujan 发表于 2005-11-2 10:49:55

看来咱们是一个问题,是不是eva还没有为64位准备好? :cry:

mandrakechina 发表于 2005-11-2 14:12:31

你可以试试安装32位的eva,从技术上来说,32位软件可以在64位系统上运行。

yujan 发表于 2005-11-3 10:54:17

用源码编译的eva,还是这样。
只能让yunfan做个说明了 :?

yunfan 发表于 2005-11-3 12:39:17

64位还真是有问题啊。
唉, 如果有个64位的机器, 一测便知。找不到这样的机器啊。
:neutral:

mandrakechina 发表于 2005-11-3 16:23:23

你可以把测试步骤告诉大家啊。

yunfan 发表于 2005-11-3 19:21:16

主要是看看发送的包是否正确, 是不是64位的int, short什么的变了size, 我猜测的。
打印出发送的数据, 和自己的qq号什么的数据一对就大概知道原因了。

首先测试一下这个程序,看看显示的结果是什么:

// sizetest.c
#include <stdio.h>
#include <arpa/inet.h>

int main(int argc, char**argv)
{
        int i;
        unsigned int test = 0x12345678;

        printf("char size : %d\n", sizeof(char));
        printf("short size: %d\n", sizeof(short));
        printf("int size: %d\n", sizeof(int));
        printf("long size : %d\n", sizeof(long));
       
        printf("test in original: 0x%8x\n", test);
        printf("test in memory    : ");
        for(i=0; i<sizeof(unsigned int); i++){
                char t = ((char *)(&test))[i];
                printf("%2x", t);
        }
        printf("\n");
        printf("htonl(test)       : 0x%8x\n", htonl(test));
        printf("ntohl(htonl(test)): 0x%8x\n", ntohl(htonl(test)));
}


随便打开一个编辑器(gedit, kedit, vim....),把上面的代码粘贴上去, 存盘退出.
命令行输入: gcc -o sizetest sizetest.c
然后: ./sizetest回车
先看一下64位的情况, 希望64位的朋友把屏幕显示内容贴出来啊。

sunmoon1997 发表于 2005-11-7 08:40:14

int 32bit
long 64bit

热メ袭 发表于 2005-11-8 10:29:13

是不是没变这样说?

64位的Linux使用LP64模型,long 和 指针(void*) 类型均要占64bit,而int类型仍然保持在32bit???

也就是说给32位的代码中将long或指针类型直接赋给int类型是没问题的(都是32bit),到了64位就会引起数据截断溢出什么的?

yunfan 发表于 2005-11-8 10:45:39

long 变化了,至少我机器上long和int是一样长的,这个可能还和系统有关, 看怎么定义了

如果强行把64位的数赋值给32位, 也不一定溢出, 看是什么情况了,
在64位系统上, 如果

int i = 8; long j = 9;
i = j;

我估计是没有事的, 编译器会自动转换, 会失去精度, 如果j的值大于0xffffffff, 那么赋值后, i肯定是不对的。

上面的情况和这个结果是一样的, 如果j太大, 结果也是不对的

int i = 8; long j = 9;
memcpy(&i, &j, 4);



因为我是基于32位机器写的代码, 所以不会出现下面的情况

memcpy(&i, &j, 8);

这个基本上,这个操作,非常危险, 大多数情况下, 会导致crash。但是
i = j; 这样就难说了, 要看编译器编译的时候是不是自动做类型转换,
一般都会转的。

热メ袭 发表于 2005-11-8 10:50:12

是不是有个icc什么的??有一个-Wp64编译参数来检测代码中的32bit到64bit的移植问题,而且有问题会给warning的??

yunfan 发表于 2005-11-8 10:53:09

icc 是intel的吧, 没用过

热メ袭 发表于 2005-11-8 11:02:42

http://net.ytu.edu.cn/share/%C8%ED%BC%FE/%B1%E0%B3%CC/Intel%B5%C4C%B1%E0%D2%EB%C6%F7/

恩...上面有的下载,不过不知道编译其他C源代码要怎么做,好象也不是开源的...

我是不是拉远了 :oops::oops: 去学习...哈哈 :mrgreen::mrgreen:

sunmoon1997 发表于 2005-11-15 20:43:48

换上了 amd64 把这个问题顺带解决了,虽然我不用 QQ.;)
很简单。 sed -i 's,<\long\>,int,g' evacrypt.h evacrypt.cpp
不过最好把 unsigned long 换成 uint32.
页: [1] 2 3
查看完整版本: Eva-3.2.0在64位系统下还是不能登录