xnwyd / myqq3

Automatically exported from code.google.com/p/myqq3
0 stars 0 forks source link

Linux下的BUG #3

Open GoogleCodeExporter opened 8 years ago

GoogleCodeExporter commented 8 years ago
LINUX下,不管怎么样,必须按^C强制干掉才行,不能自己退出�
��即使我加上了exit(0),我想问问既然已经注销了,那么为什��
�还要等待线程?

Original issue reported on code.google.com by zht...@gmail.com on 28 Aug 2010 at 10:31

GoogleCodeExporter commented 8 years ago
我在三星的i8320上编译了一个版本,运行正常,但经常出现错
误提示
iconv failed err: Invalid or incomplete multibyte or wide character

Original comment by euzen...@gmail.com on 4 Sep 2010 at 4:17

GoogleCodeExporter commented 8 years ago
iconv failed err: Invalid or incomplete multibyte or wide character

一样

Original comment by zht...@gmail.com on 11 Sep 2010 at 7:59

GoogleCodeExporter commented 8 years ago
[deleted comment]
GoogleCodeExporter commented 8 years ago
1.对zhtx10遇到的问题,我也一直存在,我今天看了看代码,试
了试,发现这是包管理线程的退出问题,主要是在packetmgr.c的
packetmgr_recv函数中,
ret = qqsocket_recv( qq->socket, recv_buf, PACKET_SIZE-pos );
看这个调用的源代码就知道了,它调用了个阻塞函数recv,我�
��linux不是很熟悉,这个多长时间会超时或者什么的,我不是�
��确信,但问题的确出现在这里,我试了一下,我想让它在5��
�中没有数据到来就超时退出,我把qqsocket.c的qqsocket_recv函数��
�成这样:
int qqsocket_recv( int fd, uchar* buf, size_t size )
{
  int ret;
  fd_set ds;
  struct timeval timeout;
  FD_ZERO(&ds);
  FD_SET(fd,&ds);
  timeout.tv_sec = 5;
  timeout.tv_usec = 0;
  ret = select(fd+1,&ds,NULL,NULL,&timeout);
  if(ret==-1)
    return ret;
  if(ret>0&&FD_ISSET(fd,&ds)){
    ret = recv( fd, (char*)buf, size, 0 );
    return ret;
  }
  return -1;
}
只要你让这个超时时间可以接受,你在命令行里面给个x,肯定
就能退出了。我也不知道为什么,send在就不会出现这样的问�
��。
2.另外,euzenlee和zhtx10都提到的iconv问题,这个好像是只有在中�
��列表接收的时候才会出现。这个我也不知道,没功夫看,我
也被这个困扰着呢。等有机会了,瞅瞅去

Original comment by kcyn...@gmail.com on 9 Oct 2010 at 2:58

GoogleCodeExporter commented 8 years ago
还有一个问题。有的时候好友备注名称不能全部抓下来。。

另外还想要一个文档 ;-)

Original comment by zht...@gmail.com on 10 Oct 2010 at 7:55

GoogleCodeExporter commented 8 years ago
其实不是不能全部抓下来,而是还没有完成。这个取决于网��
�。你看那个qqclient_keepalive函数,
//等待登陆完毕
if(qq->login_finish==0){
}
这个位置,只有当这个里面的qq->login_finish=1; 
只有当这个登陆过程全部结束之后你才能看到完整的信息,��
�且此后的消息发送才能成功。如果你在登陆完成之前就开始�
��送消息,就成功不了,说不定以后的消息就再也不了。至少
,linux下的表现是这样。

至于文档,只能靠自己看代码了,我也没细看过,我只是在��
�儿遇到问题我才会看哪儿。比如,linux下退不出来(或者是��
�久才能退出,这大概取决于socket的超时时间吧;但在windows下
却不是这样)我才会一点点跟踪到这个地方。我在linux下经常
在未登陆完成之前就发消息,当然就失败了,我也才会注意��
�这个登陆完成点的代码。

Original comment by kcyn...@gmail.com on 7 Dec 2010 at 8:17

GoogleCodeExporter commented 8 years ago
其实,还可以慢慢加入收发文件,表情图片之类的

Original comment by Allen.Tsau on 9 May 2011 at 4:49

GoogleCodeExporter commented 8 years ago
iconv 的问题 刚刚有看:
有两个地方注意一下:
1. 是如下的字符串长度 1024 有时候是不够的。
2. dump 出来的字符串在gbk 
->utf8的过程中有错。有看到错误数据。但是不知道错误数据��
�哪里来的。
看样子装换的时候要添加一些check 
机制。不能一次组成字符串然后装换。看到出错的地方qq上面
是一个方框。
static void print_string(char *str)
{
#ifdef __WIN32__
    printf( str );
#else
    FILE *fp= fopen("hd.txt","a+");
    int length = strlen(str);
    fwrite(str,1,length,fp);
    fclose(fp);
    int tempcount = (length %1024 +1)*1024;
    char tempstr[tempcount];

    gb_to_utf8( str, tempstr, sizeof(tempstr) );

    printf( tempstr );

    fflush(stdout);
#endif
}

Original comment by xhd3...@gmail.com on 27 Aug 2011 at 7:42

GoogleCodeExporter commented 8 years ago
i8320的“iconv failed err: Invalid or incomplete multibyte or wide character 
”,
这个问题可能是因为特殊字符的问题,我用to命令到一个带☆
的名字的用户出现这个错误,全英文名字的没这个错误。

Original comment by Qingshen...@gmail.com on 18 Nov 2011 at 8:18