﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-socketref,再见！高德-随笔分类-IM 系统</title><link>http://www.cppblog.com/socketref/category/20741.html</link><description>gis,mouse,luolasi</description><language>zh-cn</language><lastBuildDate>Sat, 29 Mar 2014 18:44:46 GMT</lastBuildDate><pubDate>Sat, 29 Mar 2014 18:44:46 GMT</pubDate><ttl>60</ttl><item><title>nginx+gevent+webpy+gridfs 提供文件服务集群方案</title><link>http://www.cppblog.com/socketref/archive/2014/03/29/206396.html</link><dc:creator>放屁阿狗 </dc:creator><author>放屁阿狗 </author><pubDate>Sat, 29 Mar 2014 13:27:00 GMT</pubDate><guid>http://www.cppblog.com/socketref/archive/2014/03/29/206396.html</guid><wfw:comment>http://www.cppblog.com/socketref/comments/206396.html</wfw:comment><comments>http://www.cppblog.com/socketref/archive/2014/03/29/206396.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/socketref/comments/commentRss/206396.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/socketref/services/trackbacks/206396.html</trackback:ping><description><![CDATA[系统中，用户的消息在移动设备与接入服务器建立的Tcp长连接上传递。这些消息包括：文本，复合文本，位置信息，音频剪辑，图像等等。<br />发送者传送消息到平台系统内部并将消息写入gridfs，待接收者上线时平台将消息推送至接收者。 <br />考虑到带宽利用，接收者得到的消息将不包含二进制数据，例如: 音频，图像等等。 这要求接收者对平台发起一次获取消息包内指定的音频和图像数据的请求。<br />移动端向平台请求二进制数据的情况还包含 【离线文件传送】场景 。 <br />二进制数据往往是指那些数据量比较大的对象，这些对象在移动两端交换时，交互通道将不占用与接入服务器的连接通道，而是通过nginx传送到平台内部； 同样接收者获取二进制数据也是通过nginx获取。这种请求是HTTP的。<br />这里整理的是如何在平台部署 【负载均衡的集群的分布式的文件服务】<br /><br />nginx :&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; http服务，提供反向代理和负载均衡服务（集群可用DNS或考虑LVS方案）<br />mongodb+gridfs : 用于文件服务提供，其内置gridfs提供了分布式，海量存储的方案<br />gevent+webpy : nginx直接读取gridfs是不合适的，配置了cgi才能完成特定功能，这里使用webpy，比django更轻更好用。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; webpy的作用是接收到上传和下传文件的请求，读写gridfs文件内容给移动端。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; gevent是高效的通信框架，虽然单线程工作，但性能非常的好；<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 用好gevent关键在与外部的io必须全部都是异步的，例如： 数据库，文件磁盘访问等等。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mongodb对gevent已经支持，gevent对webpy，django，psycopg2支持也相当的好，所以要提供webservice服务那就考虑用gevent+webpy或django把，性能是杠杠的，比 apache+mod_wsgi要好很多 ，而且gevent是进程内的不同的HTTP REQUEST可以是共享数据的，这一点非常诱惑(apache+mod_wsgi的REQUEST可是隔离的哦！除非您通过redis的PUB/SUB实现两个REQUEST的通信)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />关注的问题：<br />１.下传大文件时的处理<br />　　　如果直接用nginx当然没有这个问题　，但用webpy读取文件返回HttpResponse时问题来了，总不至于读取整个文件，然后再return。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这种方式在php有flush方法，python只能用yield来做<br />&nbsp;2.上传大文件时的处理<br />&nbsp; &nbsp; &nbsp; &nbsp; 当接收到http的文件POST请求时，文件已经全部缓存到web服务器，如果同时几千个文件上传在进行，服务器就会被挤爆，这也是很多网站不允许大文件上传的缘故吧。关于这个问题，我想就需要修改一下webpy关于文件上传的处理代码了，将接收到的文件数据以流的形式写入到gridfs里去作为临时文件被缓存，等完全接收文件时，才通知到handler代码，这样必定高效很多(新的问题又来了，会不会把gridfs搞爆掉! 处理时考虑延时缓存提交gridfs把)。<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">BUF_SIZE&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">262144</span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;download:<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">def</span><span style="color: #000000; ">&nbsp;GET(self):<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;file_name&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #800000; ">'</span><span style="color: #800000; ">file_name</span><span style="color: #800000; ">'</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;file_path&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;os.path.join(</span><span style="color: #800000; ">'</span><span style="color: #800000; ">file_path</span><span style="color: #800000; ">'</span><span style="color: #000000; ">,&nbsp;file_name)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;None<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">try</span><span style="color: #000000; ">:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;open(file_path,&nbsp;</span><span style="color: #800000; ">"</span><span style="color: #800000; ">rb</span><span style="color: #800000; ">"</span><span style="color: #000000; ">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;webpy.header(</span><span style="color: #800000; ">'</span><span style="color: #800000; ">Content-Type</span><span style="color: #800000; ">'</span><span style="color: #000000; ">,</span><span style="color: #800000; ">'</span><span style="color: #800000; ">application/octet-stream</span><span style="color: #800000; ">'</span><span style="color: #000000; ">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;webpy.header(</span><span style="color: #800000; ">'</span><span style="color: #800000;">Content-disposition</span><span style="color: #800000; ">'</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #800000; ">'</span><span style="color: #800000; ">attachment;&nbsp;filename=%s.dat</span><span style="color: #800000; ">'</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">%</span><span style="color: #000000; ">&nbsp;file_name)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">&nbsp;True:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;f.read(BUF_SIZE)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;c:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">yield</span><span style="color: #000000; ">&nbsp;c<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; ">:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">break</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">except</span><span style="color: #000000; ">&nbsp;Exception,&nbsp;e:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">print</span><span style="color: #000000; ">&nbsp;e<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">yield</span><span style="color: #000000; ">&nbsp;</span><span style="color: #800000; ">'</span><span style="color: #800000; ">Error</span><span style="color: #800000; ">'</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">finally</span><span style="color: #000000; ">:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;f:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f.close()<br /></span></div><br /><br /><br />links: <br /><div>http://api.mongodb.org/python</div><div>http://webpy.org/cookbook/storeupload.zh-cn</div><div>http://webpy.org/cookbook/streaming_large_files</div>http://gevent.org&nbsp;&nbsp; 下份代码 demo很值得看哦 gevent 1.0 由libev 替换了libevent<br /><br />　<br /><img src ="http://www.cppblog.com/socketref/aggbug/206396.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/socketref/" target="_blank">放屁阿狗 </a> 2014-03-29 21:27 <a href="http://www.cppblog.com/socketref/archive/2014/03/29/206396.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>messageserver.py</title><link>http://www.cppblog.com/socketref/archive/2013/12/07/204643.html</link><dc:creator>放屁阿狗 </dc:creator><author>放屁阿狗 </author><pubDate>Fri, 06 Dec 2013 17:54:00 GMT</pubDate><guid>http://www.cppblog.com/socketref/archive/2013/12/07/204643.html</guid><wfw:comment>http://www.cppblog.com/socketref/comments/204643.html</wfw:comment><comments>http://www.cppblog.com/socketref/archive/2013/12/07/204643.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/socketref/comments/commentRss/204643.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/socketref/services/trackbacks/204643.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 贴代码&nbsp;Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->&nbsp; &nbsp;1&nbsp;#--coding:utf-8--&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;3&nbsp;&nbsp;...&nbsp;&nbsp;<a href='http://www.cppblog.com/socketref/archive/2013/12/07/204643.html'>阅读全文</a><img src ="http://www.cppblog.com/socketref/aggbug/204643.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/socketref/" target="_blank">放屁阿狗 </a> 2013-12-07 01:54 <a href="http://www.cppblog.com/socketref/archive/2013/12/07/204643.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>IM的文本消息格式</title><link>http://www.cppblog.com/socketref/archive/2013/11/30/204521.html</link><dc:creator>放屁阿狗 </dc:creator><author>放屁阿狗 </author><pubDate>Fri, 29 Nov 2013 16:34:00 GMT</pubDate><guid>http://www.cppblog.com/socketref/archive/2013/11/30/204521.html</guid><wfw:comment>http://www.cppblog.com/socketref/comments/204521.html</wfw:comment><comments>http://www.cppblog.com/socketref/archive/2013/11/30/204521.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/socketref/comments/commentRss/204521.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/socketref/services/trackbacks/204521.html</trackback:ping><description><![CDATA[<div><div style="font-family: Tahoma; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">多样的文本消息</div><div style="font-family: Tahoma; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">-----------------</div><div style="font-family: Tahoma; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">struct MimeText_t{<br /> &nbsp;&nbsp;&nbsp;&nbsp; int type;<br /> &nbsp;&nbsp;&nbsp;&nbsp; string text;<br /> };</div><div style="font-family: Tahoma; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;"></div><div style="font-family: Tahoma; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">MimeText_t 可以包含普通的文本、图像和音频文件的id&nbsp;</div><div style="font-family: Tahoma; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">图像和音频数据发送到服务器，服务器并不直接将数据发送到接收者，而是发送 音频和图像的描述uri信息&nbsp;</div><div style="font-family: Tahoma; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">接收者解释json，显示text文本，读取emoticon编号，显示表情图片; &nbsp;image,audio则显示占位(如果当前wifi可用,则自己自动加载image和audio资源) ,如果非wifi信号则待用户点击此占位，然后从服务器请求image和audio资源到本地。</div><div style="font-family: Tahoma; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;"></div><div style="font-family: Tahoma; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;"></div><div style="font-family: Tahoma; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">文本描述：　字体大小，颜色，文本link，表情符号&nbsp;</div><div style="font-family: Tahoma; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">文本用json组织 ，</div><div style="font-family: Tahoma; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">{</div><div style="font-family: Tahoma; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">&nbsp; set:[</div><div style="font-family: Tahoma; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">&nbsp; &nbsp; &nbsp;text:{text:'this is',bg-color:#ff0000,color:#ffffff,font-name:'arial',font-size:20,bold:true,italic:true},</div><div style="font-family: Tahoma; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">&nbsp; &nbsp; &nbsp;text:{text:'shanghai',color:#ff0000,font-name:'arial',font-size:20,bold:true,italic:true,link:'http://sw2us.com/images/shanghai.png'},</div><div style="font-family: Tahoma; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">&nbsp; &nbsp; &nbsp;image:{id:1001,width:200,height:200,uri:'http://sw2us.com/images/bear.png'},</div><div style="font-family: Tahoma; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;"><div>&nbsp; &nbsp; &nbsp;audio:{id:2001,duration:5,uri:'http://sw2us.com/clips/a001.mp3'},</div><div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;location:{lon:121.221,lat,time,speed,direction,text:'立月路2001号浦星公路口'},</div></div><div style="font-family: Tahoma; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">&nbsp; &nbsp; &nbsp;emoticon:{id:201}</div><div style="font-family: Tahoma; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">&nbsp; ],</div><div style="font-family: Tahoma; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">}</div><div style="font-family: Tahoma; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;"></div><div style="font-family: Tahoma; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">属性名简化：&nbsp;</div><div style="font-family: Tahoma; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">---------------------</div><div style="font-family: Tahoma; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;"></div><div style="font-family: Tahoma; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">-----------------------</div><div style="font-family: Tahoma; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">1 - text &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [ 1: text , 2: bg-color , 3: color , 4: font-name, 5:font-size, 6:bold, 7:italic ]</div><div style="font-family: Tahoma; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">2 - image &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;[ 1: id , 2:width , 3:height , 4:uri]</div><div style="font-family: Tahoma; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">3 - audio &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [ 1:id , 2:duration,3:uri]</div><div style="font-family: Tahoma; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">4 - location &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;[ 1:lon, 2:lat, 3:time, 4:speed, 5:direction, 6:text]</div><div style="font-family: Tahoma; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">5 -&nbsp;emoticon &nbsp; &nbsp; &nbsp; &nbsp;[ 1: id ]</div><div style="font-family: Tahoma; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">-----------------------</div><div style="font-family: Tahoma; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">0 - false</div><div style="font-family: Tahoma; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">1 - true&nbsp;</div></div><img src ="http://www.cppblog.com/socketref/aggbug/204521.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/socketref/" target="_blank">放屁阿狗 </a> 2013-11-30 00:34 <a href="http://www.cppblog.com/socketref/archive/2013/11/30/204521.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>