SnooQQ发布V0.2版

[| 2010/11/16 17:51]
| |
今天发布了SnooQQ的0.2版,相比0.1版增加了号码重登陆和号码下线功能。并升级了配套的php页面,修复myqq中下线的一个recv导致线程饿死的问题。

目前SnooQQ的功能:qq上线、验证码输入、重登陆、下线、发消息、收消息。

SnooQQ是一个多线程挂Q服务程序,使用EPOLL模型,可以同时处理多用户业务请求,其他程序可以使用指定的数据格式与之通信,向其发送qq登陆、下线、发消息、收消息等指令。与qq服务器的通信使用myqq封装的协议库。

总结一下开发的心得:

1,曾经在收消息时总是多出一块,调试一下午毫无收获,后来发现myqq在从gbk到utf8转换的时候用同一个buffer存放输入和输出的字符串,而同一条消息用gbk编码时长度要小于用utf8时,导致buffer中存在垃圾数据。

2,刚刚发布到VPS上的时候发现在开发机上只占很小内存的程序在VPS上要占数十M内存。纠结不知为何,后来发现原来使用OPENVZ技术虚拟出的VPS在计算内存用量的时候是按占用虚拟地址的大小来计量的。比如malloc一块10m的内存,但是不使用,在普通机器上占内存数几乎为0,在OPENVZ的VPS上要占用10M的内存配额。SnooQQ由于是多线程程序,每个线程默认分配8M的栈,导致每增加一个线程就要消耗8M多的虚拟地址空间。实际上使用的栈空间很小,估计了程序大概使用的栈大小后,用ulimit -s 256设置栈大小为256k,内存用量降低到了可接收的程度,程序运行不收影响。

3,之前在调试myqq的时候发现退出号码的时候总是有一个线程卡住无法退出,代码中也提到会阻塞。但是经过观察发现很多时候会卡死不退出。详细查了下代码,发现阻塞的线程在号码退出是阻塞在recv上,而另一个线程调用close去关闭socket时不会唤醒此进程。所以该线程长时间阻塞在recv上。假如服务器长时间没有消息发往该套接口,那么线程就卡住无法返回。(理论上服务器是周期性发送数据的,但我测试的时候经常会在recv上阻塞数分钟之久,具体原因待详细考察),我修改了一下,退出时对recv的线程调用pthread_cancel函数将其退出。不过略显粗暴,后期会进行优化。
by snooda | 分类: 默认分类 | 评论(0) | 引用(0) | 阅读(1655)
发表评论
表情
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
打开HTML
打开UBB
打开表情
隐藏
记住我
昵称   密码   游客无需密码
网址   电邮   [注册]