<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[Snooda]]></title> 
<link>http://www.snooda.com/index</link> 
<description><![CDATA[Snooda's Blog]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[Snooda]]></copyright>
<item>
<link>http://www.snooda.com/read/</link>
<title><![CDATA[SnooQQ发布V0.2版]]></title> 
<author>snooda &lt;admin@snooda.com&gt;</author>
<category><![CDATA[默认分类]]></category>
<pubDate>Tue, 16 Nov 2010 09:51:29 +0000</pubDate> 
<guid>http://www.snooda.com/read/</guid> 
<description>
<![CDATA[ 
	    今天发布了SnooQQ的0.2版，相比0.1版增加了号码重登陆和号码下线功能。并升级了配套的php页面，修复myqq中下线的一个recv导致线程饿死的问题。<br />
<br />
    目前SnooQQ的功能：qq上线、验证码输入、重登陆、下线、发消息、收消息。<br />
    <br />
    SnooQQ是一个多线程挂Q服务程序，使用EPOLL模型，可以同时处理多用户业务请求，其他程序可以使用指定的数据格式与之通信，向其发送qq登陆、下线、发消息、收消息等指令。与qq服务器的通信使用myqq封装的协议库。<br />
<br />
    总结一下开发的心得：<br />
<br />
    1，曾经在收消息时总是多出一块，调试一下午毫无收获，后来发现myqq在从gbk到utf8转换的时候用同一个buffer存放输入和输出的字符串，而同一条消息用gbk编码时长度要小于用utf8时，导致buffer中存在垃圾数据。<br />
<br />
    2，刚刚发布到VPS上的时候发现在开发机上只占很小内存的程序在VPS上要占数十M内存。纠结不知为何，后来发现原来使用OPENVZ技术虚拟出的VPS在计算内存用量的时候是按占用虚拟地址的大小来计量的。比如malloc一块10m的内存，但是不使用，在普通机器上占内存数几乎为0，在OPENVZ的VPS上要占用10M的内存配额。SnooQQ由于是多线程程序，每个线程默认分配8M的栈，导致每增加一个线程就要消耗8M多的虚拟地址空间。实际上使用的栈空间很小，估计了程序大概使用的栈大小后，用ulimit -s 256设置栈大小为256k，内存用量降低到了可接收的程度，程序运行不收影响。<br />
    <br />
    3，之前在调试myqq的时候发现退出号码的时候总是有一个线程卡住无法退出，代码中也提到会阻塞。但是经过观察发现很多时候会卡死不退出。详细查了下代码，发现阻塞的线程在号码退出是阻塞在recv上，而另一个线程调用close去关闭socket时不会唤醒此进程。所以该线程长时间阻塞在recv上。假如服务器长时间没有消息发往该套接口，那么线程就卡住无法返回。（理论上服务器是周期性发送数据的，但我测试的时候经常会在recv上阻塞数分钟之久，具体原因待详细考察），我修改了一下，退出时对recv的线程调用pthread_cancel函数将其退出。不过略显粗暴，后期会进行优化。<br />
    
]]>
</description>
</item><item>
<link>http://www.snooda.com/read/#blogcomment</link>
<title><![CDATA[[评论] SnooQQ发布V0.2版]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://www.snooda.com/read/#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>