﻿<?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,再见！高德-随笔分类-C++/Boost/STL/Template</title><link>http://www.cppblog.com/socketref/category/459.html</link><description>https://github.com/adoggie</description><language>zh-cn</language><lastBuildDate>Thu, 24 Mar 2016 16:15:39 GMT</lastBuildDate><pubDate>Thu, 24 Mar 2016 16:15:39 GMT</pubDate><ttl>60</ttl><item><title>有问题的c++通信代码的识别</title><link>http://www.cppblog.com/socketref/archive/2016/03/24/213106.html</link><dc:creator>放屁阿狗 </dc:creator><author>放屁阿狗 </author><pubDate>Thu, 24 Mar 2016 07:29:00 GMT</pubDate><guid>http://www.cppblog.com/socketref/archive/2016/03/24/213106.html</guid><wfw:comment>http://www.cppblog.com/socketref/comments/213106.html</wfw:comment><comments>http://www.cppblog.com/socketref/archive/2016/03/24/213106.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/socketref/comments/commentRss/213106.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/socketref/services/trackbacks/213106.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 有问题的c++通信代码的识别，希望写c++的码农不要犯同样的错&nbsp;&nbsp;<a href='http://www.cppblog.com/socketref/archive/2016/03/24/213106.html'>阅读全文</a><img src ="http://www.cppblog.com/socketref/aggbug/213106.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/socketref/" target="_blank">放屁阿狗 </a> 2016-03-24 15:29 <a href="http://www.cppblog.com/socketref/archive/2016/03/24/213106.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>加快编译速度</title><link>http://www.cppblog.com/socketref/archive/2010/10/26/131324.html</link><dc:creator>放屁阿狗 </dc:creator><author>放屁阿狗 </author><pubDate>Tue, 26 Oct 2010 06:01:00 GMT</pubDate><guid>http://www.cppblog.com/socketref/archive/2010/10/26/131324.html</guid><wfw:comment>http://www.cppblog.com/socketref/comments/131324.html</wfw:comment><comments>http://www.cppblog.com/socketref/archive/2010/10/26/131324.html#Feedback</comments><slash:comments>19</slash:comments><wfw:commentRss>http://www.cppblog.com/socketref/comments/commentRss/131324.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/socketref/services/trackbacks/131324.html</trackback:ping><description><![CDATA[项目开发过程中最痛苦的就是头疼编译速度，稍微做修改编译的时间比修改时间更长<br>系统越时髦，开发环境版本越高，机器配置再高(我的配置4G,I720),但vc的编译器速度一点都提高不了多少<br>提高编译速度尝试了很多方法:<br>1.买更快的机器<br>2.更换编译器，vc6还是能保持最快的速度，vs2008等等越来越垃圾<br>3.更换操作系统 win2003<br>4.使用服务器编译，用2，3台机器协同进来编译工程 <br><br>以上均不能让我有满意的效果<br>那最好的方式就是调整自己的代码结构了，c编译器为何如老牛般吃力，就是由于c语言灵活带来的问题，不同对象文件关联不正当将大大增大了编译时间。<br>所以在定义工程对象依赖关系时，必须注意&lt;include&gt; 。<br>我一般的做法是：<br>class A,class B, 那在 a.h 中先声明 class B,然后定义一个B*即可<br>只有在a.c内要用到B结构时才加上include "b.h"<br>这样代码关联就没有那么紧密了，编译器也会变的聪明点了，不会由于一个无关紧要的修改，导致大批量的源文件被重新编译。<br><br><br><br><br><img src ="http://www.cppblog.com/socketref/aggbug/131324.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/socketref/" target="_blank">放屁阿狗 </a> 2010-10-26 14:01 <a href="http://www.cppblog.com/socketref/archive/2010/10/26/131324.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>游戏IP代理</title><link>http://www.cppblog.com/socketref/archive/2010/09/30/128111.html</link><dc:creator>放屁阿狗 </dc:creator><author>放屁阿狗 </author><pubDate>Wed, 29 Sep 2010 17:17:00 GMT</pubDate><guid>http://www.cppblog.com/socketref/archive/2010/09/30/128111.html</guid><wfw:comment>http://www.cppblog.com/socketref/comments/128111.html</wfw:comment><comments>http://www.cppblog.com/socketref/archive/2010/09/30/128111.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/socketref/comments/commentRss/128111.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/socketref/services/trackbacks/128111.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: v\:* {behavior:url(#default#VML);}o\:* {behavior:url(#default#VML);}w\:* {behavior:url(#default#VML);}.shape {behavior:url(#default#VML);}Normal07.8 磅02falsefalsefa...&nbsp;&nbsp;<a href='http://www.cppblog.com/socketref/archive/2010/09/30/128111.html'>阅读全文</a><img src ="http://www.cppblog.com/socketref/aggbug/128111.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/socketref/" target="_blank">放屁阿狗 </a> 2010-09-30 01:17 <a href="http://www.cppblog.com/socketref/archive/2010/09/30/128111.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>游戏逆向逻辑接口定义</title><link>http://www.cppblog.com/socketref/archive/2010/09/30/128109.html</link><dc:creator>放屁阿狗 </dc:creator><author>放屁阿狗 </author><pubDate>Wed, 29 Sep 2010 16:40:00 GMT</pubDate><guid>http://www.cppblog.com/socketref/archive/2010/09/30/128109.html</guid><wfw:comment>http://www.cppblog.com/socketref/comments/128109.html</wfw:comment><comments>http://www.cppblog.com/socketref/archive/2010/09/30/128109.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/socketref/comments/commentRss/128109.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/socketref/services/trackbacks/128109.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 跟逆向的协同是制定标准交互接口gtr_api.hCode highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->&nbsp;&nbsp;1&nbsp;/*&nbsp;&nbsp;2&nbsp;gtr_api.h&nbsp;&nbsp;3&nbsp;========...&nbsp;&nbsp;<a href='http://www.cppblog.com/socketref/archive/2010/09/30/128109.html'>阅读全文</a><img src ="http://www.cppblog.com/socketref/aggbug/128109.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/socketref/" target="_blank">放屁阿狗 </a> 2010-09-30 00:40 <a href="http://www.cppblog.com/socketref/archive/2010/09/30/128109.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>做游戏交易系统，采用ICE之后定义的系统接口</title><link>http://www.cppblog.com/socketref/archive/2010/09/30/128108.html</link><dc:creator>放屁阿狗 </dc:creator><author>放屁阿狗 </author><pubDate>Wed, 29 Sep 2010 16:38:00 GMT</pubDate><guid>http://www.cppblog.com/socketref/archive/2010/09/30/128108.html</guid><wfw:comment>http://www.cppblog.com/socketref/comments/128108.html</wfw:comment><comments>http://www.cppblog.com/socketref/archive/2010/09/30/128108.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/socketref/comments/commentRss/128108.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/socketref/services/trackbacks/128108.html</trackback:ping><description><![CDATA[<br><br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008080;">&nbsp;&nbsp;1</span>&nbsp;<span style="color: #008000;">/*</span><span style="color: #008000;"><br></span><span style="color: #008080;">&nbsp;&nbsp;2</span>&nbsp;<span style="color: #008000;"><br></span><span style="color: #008080;">&nbsp;&nbsp;3</span>&nbsp;<span style="color: #008000;">2010.3.25&nbsp;zhangbin&nbsp;<br></span><span style="color: #008080;">&nbsp;&nbsp;4</span>&nbsp;<span style="color: #008000;">1.create,定义game-core的网络接口<br></span><span style="color: #008080;">&nbsp;&nbsp;5</span>&nbsp;<span style="color: #008000;"><br></span><span style="color: #008080;">&nbsp;&nbsp;6</span>&nbsp;<span style="color: #008000;">协定:<br></span><span style="color: #008080;">&nbsp;&nbsp;7</span>&nbsp;<span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;1.数据类型名称尾部添加T<br></span><span style="color: #008080;">&nbsp;&nbsp;8</span>&nbsp;<span style="color: #008000;"><br></span><span style="color: #008080;">&nbsp;&nbsp;9</span>&nbsp;<span style="color: #008000;">2010.3.27&nbsp;zhangin<br></span><span style="color: #008080;">&nbsp;10</span>&nbsp;<span style="color: #008000;"><br></span><span style="color: #008080;">&nbsp;11</span>&nbsp;<span style="color: #008000;">2010.3.29&nbsp;zhangbin<br></span><span style="color: #008080;">&nbsp;12</span>&nbsp;<span style="color: #008000;">1.&nbsp;取消工作单GameWorkSheetT结构<br></span><span style="color: #008080;">&nbsp;13</span>&nbsp;<span style="color: #008000;">2.&nbsp;修改&nbsp;ISecureService.auth()安全认证的数据类型<br></span><span style="color: #008080;">&nbsp;14</span>&nbsp;<span style="color: #008000;">2010.3.30&nbsp;zhangbin&nbsp;<br></span><span style="color: #008080;">&nbsp;15</span>&nbsp;<span style="color: #008000;">1.&nbsp;heartbeat()移动到IService接口<br></span><span style="color: #008080;">&nbsp;16</span>&nbsp;<span style="color: #008000;"></span><span style="color: #008000;">*/</span><span style="color: #000000;"><br></span><span style="color: #008080;">&nbsp;17</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">&nbsp;18</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">&nbsp;19</span>&nbsp;<span style="color: #000000;">#ifndef&nbsp;_GTR_ICE<br></span><span style="color: #008080;">&nbsp;20</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;_GTR_ICE</span><span style="color: #000000;"><br></span><span style="color: #008080;">&nbsp;21</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">&nbsp;22</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">&nbsp;23</span>&nbsp;<span style="color: #000000;">module&nbsp;gtr&nbsp;{<br></span><span style="color: #008080;">&nbsp;24</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">&nbsp;25</span>&nbsp;<span style="color: #000000;">dictionary</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">,</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;HashValueSet;<br></span><span style="color: #008080;">&nbsp;26</span>&nbsp;<span style="color: #000000;">dictionary</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">,</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;ReturnValueT;<br></span><span style="color: #008080;">&nbsp;27</span>&nbsp;<span style="color: #000000;">sequence</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">byte</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ByteStreamT;<br></span><span style="color: #008080;">&nbsp;28</span>&nbsp;<span style="color: #000000;">sequence</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StringListT;<br></span><span style="color: #008080;">&nbsp;29</span>&nbsp;<span style="color: #000000;">sequence</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">HashValueSet</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;HashValueListT;<br></span><span style="color: #008080;">&nbsp;30</span>&nbsp;<span style="color: #000000;">sequence</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IntListT;<br></span><span style="color: #008080;">&nbsp;31</span>&nbsp;<span style="color: #000000;">sequence</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">StringListT</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;StringListListT;<br></span><span style="color: #008080;">&nbsp;32</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">&nbsp;33</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">struct</span><span style="color: #000000;">&nbsp;CallReturnT{<br></span><span style="color: #008080;">&nbsp;34</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">bool</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;succ;<br></span><span style="color: #008080;">&nbsp;35</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&nbsp;msg;<br></span><span style="color: #008080;">&nbsp;36</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;HashValueSet&nbsp;props;<br></span><span style="color: #008080;">&nbsp;37</span>&nbsp;<span style="color: #000000;">};<br></span><span style="color: #008080;">&nbsp;38</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">&nbsp;39</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;IMAGEJPEG&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br></span><span style="color: #008080;">&nbsp;40</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;IMAGEPNG&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">2</span><span style="color: #000000;">&nbsp;;<br></span><span style="color: #008080;">&nbsp;41</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;IMAGEBMP&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">3</span><span style="color: #000000;">&nbsp;;<br></span><span style="color: #008080;">&nbsp;42</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">&nbsp;43</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">&nbsp;44</span>&nbsp;<span style="color: #000000;"></span><span style="color: #008000;">//</span><span style="color: #008000;">图像数据</span><span style="color: #008000;"><br></span><span style="color: #008080;">&nbsp;45</span>&nbsp;<span style="color: #008000;"></span><span style="color: #0000ff;">struct</span><span style="color: #000000;">&nbsp;ImageDataT{<br></span><span style="color: #008080;">&nbsp;46</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;type;<br></span><span style="color: #008080;">&nbsp;47</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;ByteStreamT&nbsp;&nbsp;&nbsp;&nbsp;bytes;<br></span><span style="color: #008080;">&nbsp;48</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;width;<br></span><span style="color: #008080;">&nbsp;49</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;height;&nbsp;&nbsp;&nbsp;&nbsp;<br></span><span style="color: #008080;">&nbsp;50</span>&nbsp;<span style="color: #000000;">};<br></span><span style="color: #008080;">&nbsp;51</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">&nbsp;52</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">struct</span><span style="color: #000000;">&nbsp;GameAuthDataT{<br></span><span style="color: #008080;">&nbsp;53</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;type;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;1-&nbsp;图片&nbsp;,2&nbsp;-&nbsp;坐标</span><span style="color: #008000;"><br></span><span style="color: #008080;">&nbsp;54</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;ImageDataT&nbsp;image;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">秘宝图片</span><span style="color: #008000;"><br></span><span style="color: #008080;">&nbsp;55</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&nbsp;seckey;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">秘宝坐标</span><span style="color: #008000;"><br></span><span style="color: #008080;">&nbsp;56</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">};<br></span><span style="color: #008080;">&nbsp;57</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">&nbsp;58</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">&nbsp;59</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">struct</span><span style="color: #000000;">&nbsp;GameIdentifyT{<br></span><span style="color: #008080;">&nbsp;60</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&nbsp;id;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">游戏编号</span><span style="color: #008000;"><br></span><span style="color: #008080;">&nbsp;61</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&nbsp;tradeNo;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">交易单号</span><span style="color: #008000;"><br></span><span style="color: #008080;">&nbsp;62</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">};<br></span><span style="color: #008080;">&nbsp;63</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">&nbsp;64</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">struct</span><span style="color: #000000;">&nbsp;ServiceIdentifyT{<br></span><span style="color: #008080;">&nbsp;65</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&nbsp;id;<br></span><span style="color: #008080;">&nbsp;66</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&nbsp;version;<br></span><span style="color: #008080;">&nbsp;67</span>&nbsp;<span style="color: #000000;">};<br></span><span style="color: #008080;">&nbsp;68</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">&nbsp;69</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">&nbsp;70</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">interface</span><span style="color: #000000;">&nbsp;IService{<br></span><span style="color: #008080;">&nbsp;71</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getType();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;&nbsp;</span><span style="color: #008000;"><br></span><span style="color: #008080;">&nbsp;72</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;ServiceIdentifyT&nbsp;&nbsp;&nbsp;&nbsp;getId();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">service&nbsp;module&nbsp;id</span><span style="color: #008000;"><br></span><span style="color: #008080;">&nbsp;73</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&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;&nbsp;&nbsp;&nbsp;&nbsp;getTimestamp();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">获取系统时钟&nbsp;&nbsp;1970之后秒数</span><span style="color: #008000;"><br></span><span style="color: #008080;">&nbsp;74</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&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;&nbsp;&nbsp;&nbsp;&nbsp;shutdown();<br></span><span style="color: #008080;">&nbsp;75</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&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;&nbsp;&nbsp;&nbsp;&nbsp;heartbeat(</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&nbsp;senderType,</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&nbsp;senderId);&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">发送者类型和Id</span><span style="color: #008000;"><br></span><span style="color: #008080;">&nbsp;76</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">};<br></span><span style="color: #008080;">&nbsp;77</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">&nbsp;78</span>&nbsp;<span style="color: #000000;"></span><span style="color: #008000;">/*</span><span style="color: #008000;"><br></span><span style="color: #008080;">&nbsp;79</span>&nbsp;<span style="color: #008000;">enum&nbsp;LogMsgLevelT{<br></span><span style="color: #008080;">&nbsp;80</span>&nbsp;<span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;logDEBUG,<br></span><span style="color: #008080;">&nbsp;81</span>&nbsp;<span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;logINFO,<br></span><span style="color: #008080;">&nbsp;82</span>&nbsp;<span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;logCRITICAL,<br></span><span style="color: #008080;">&nbsp;83</span>&nbsp;<span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;logERROR<br></span><span style="color: #008080;">&nbsp;84</span>&nbsp;<span style="color: #008000;">};<br></span><span style="color: #008080;">&nbsp;85</span>&nbsp;<span style="color: #008000;"></span><span style="color: #008000;">*/</span><span style="color: #000000;"><br></span><span style="color: #008080;">&nbsp;86</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;<br></span><span style="color: #008080;">&nbsp;87</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">struct</span><span style="color: #000000;">&nbsp;LogMessageT{<br></span><span style="color: #008080;">&nbsp;88</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xclass;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">消息类型&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;"><br></span><span style="color: #008080;">&nbsp;89</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;msg;&nbsp;&nbsp;&nbsp;&nbsp;<br></span><span style="color: #008080;">&nbsp;90</span>&nbsp;<span style="color: #000000;">};<br></span><span style="color: #008080;">&nbsp;91</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">&nbsp;92</span>&nbsp;<span style="color: #000000;"></span><span style="color: #008000;">//</span><span style="color: #008000;">日志功能</span><span style="color: #008000;"><br></span><span style="color: #008080;">&nbsp;93</span>&nbsp;<span style="color: #008000;"></span><span style="color: #0000ff;">interface</span><span style="color: #000000;">&nbsp;ILogger&nbsp;{<br></span><span style="color: #008080;">&nbsp;94</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;gameMsg(GameIdentifyT&nbsp;gameId,</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;timetick,LogMessageT&nbsp;msg);&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;timetick&nbsp;-&nbsp;1970~&nbsp;s</span><span style="color: #008000;"><br></span><span style="color: #008080;">&nbsp;95</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;gameImage(GameIdentifyT&nbsp;gameId,</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;timetick,</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&nbsp;opName,ImageDataT&nbsp;image);&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">抓图&nbsp;opName&nbsp;-&nbsp;执行游戏步骤名称</span><span style="color: #008000;"><br></span><span style="color: #008080;">&nbsp;96</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">};<br></span><span style="color: #008080;">&nbsp;97</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">&nbsp;98</span>&nbsp;<span style="color: #000000;"></span><span style="color: #008000;">//</span><span style="color: #008000;">安全管理，包括秘宝认证等</span><span style="color: #008000;"><br></span><span style="color: #008080;">&nbsp;99</span>&nbsp;<span style="color: #008000;"></span><span style="color: #0000ff;">interface</span><span style="color: #000000;">&nbsp;ISecure&nbsp;{<br></span><span style="color: #008080;">100</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&nbsp;auth(GameIdentifyT&nbsp;gameId,GameAuthDataT&nbsp;data);&nbsp;<br></span><span style="color: #008080;">101</span>&nbsp;<span style="color: #000000;">};<br></span><span style="color: #008080;">102</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">103</span>&nbsp;<span style="color: #000000;"></span><span style="color: #008000;">//</span><span style="color: #008000;">日志服务器</span><span style="color: #008000;"><br></span><span style="color: #008080;">104</span>&nbsp;<span style="color: #008000;"></span><span style="color: #0000ff;">interface</span><span style="color: #000000;">&nbsp;ILogServer&nbsp;extends&nbsp;ILogger,IService{<br></span><span style="color: #008080;">105</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;<br></span><span style="color: #008080;">106</span>&nbsp;<span style="color: #000000;">};<br></span><span style="color: #008080;">107</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">108</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">interface</span><span style="color: #000000;">&nbsp;ISecureServer&nbsp;extends&nbsp;ISecure,IService{<br></span><span style="color: #008080;">109</span>&nbsp;<span style="color: #000000;">};<br></span><span style="color: #008080;">110</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">111</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">112</span>&nbsp;<span style="color: #000000;"></span><span style="color: #008000;">//</span><span style="color: #008000;">一个游戏任务相关的信息</span><span style="color: #008000;"><br></span><span style="color: #008080;">113</span>&nbsp;<span style="color: #008000;"></span><span style="color: #0000ff;">enum</span><span style="color: #000000;">&nbsp;GameWorkSheetTypeT{<br></span><span style="color: #008080;">114</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;gwsPost,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">邮寄</span><span style="color: #008000;"><br></span><span style="color: #008080;">115</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;gwsAccountAudit,&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">帐号审核</span><span style="color: #008000;"><br></span><span style="color: #008080;">116</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;gwsVerify&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">验证</span><span style="color: #008000;"><br></span><span style="color: #008080;">117</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">};<br></span><span style="color: #008080;">118</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">119</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">120</span>&nbsp;<span style="color: #000000;"></span><span style="color: #008000;">//</span><span style="color: #008000;">邮寄</span><span style="color: #008000;"><br></span><span style="color: #008080;">121</span>&nbsp;<span style="color: #008000;"></span><span style="color: #0000ff;">struct</span><span style="color: #000000;">&nbsp;GameWorkSheetPostT&nbsp;{<br></span><span style="color: #008080;">122</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">long</span><span style="color: #000000;">&nbsp;money;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br></span><span style="color: #008080;">123</span>&nbsp;<span style="color: #000000;">};<br></span><span style="color: #008080;">124</span>&nbsp;<span style="color: #000000;"></span><span style="color: #008000;">//</span><span style="color: #008000;">审核</span><span style="color: #008000;"><br></span><span style="color: #008080;">125</span>&nbsp;<span style="color: #008000;"></span><span style="color: #0000ff;">struct</span><span style="color: #000000;">&nbsp;GameWorkSheetAccountAuditT&nbsp;{<br></span><span style="color: #008080;">126</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&nbsp;any;<br></span><span style="color: #008080;">127</span>&nbsp;<span style="color: #000000;">};<br></span><span style="color: #008080;">128</span>&nbsp;<span style="color: #000000;"></span><span style="color: #008000;">//</span><span style="color: #008000;">验证</span><span style="color: #008000;"><br></span><span style="color: #008080;">129</span>&nbsp;<span style="color: #008000;"></span><span style="color: #0000ff;">struct</span><span style="color: #000000;">&nbsp;GameWorkSheetVerifyT&nbsp;{<br></span><span style="color: #008080;">130</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&nbsp;any;<br></span><span style="color: #008080;">131</span>&nbsp;<span style="color: #000000;">};<br></span><span style="color: #008080;">132</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">133</span>&nbsp;<span style="color: #000000;"></span><span style="color: #008000;">//</span><span style="color: #008000;">交易任务信息<br></span><span style="color: #008080;">134</span>&nbsp;<span style="color: #008000;"></span><span style="color: #008000;">//</span><span style="color: #008000;">Tasklet包含所有的业务处理类型，但同时只有一种有效</span><span style="color: #008000;"><br></span><span style="color: #008080;">135</span>&nbsp;<span style="color: #008000;"></span><span style="color: #0000ff;">struct</span><span style="color: #000000;">&nbsp;GameTaskletT{<br></span><span style="color: #008080;">136</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&nbsp;id;&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;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">任务编号</span><span style="color: #008000;"><br></span><span style="color: #008080;">137</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;type;&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;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">处理类型</span><span style="color: #008000;"><br></span><span style="color: #008080;">138</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&nbsp;no;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">单号</span><span style="color: #008000;"><br></span><span style="color: #008080;">139</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&nbsp;gameId;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">游戏编号</span><span style="color: #008000;"><br></span><span style="color: #008080;">140</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&nbsp;account;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">帐号</span><span style="color: #008000;"><br></span><span style="color: #008080;">141</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&nbsp;password;<br></span><span style="color: #008080;">142</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&nbsp;area;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">区</span><span style="color: #008000;"><br></span><span style="color: #008080;">143</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&nbsp;server;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">服务器</span><span style="color: #008000;"><br></span><span style="color: #008080;">144</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&nbsp;lineName;</span><span style="color: #008000;">//</span><span style="color: #008000;">线路名称(为空则lineNo)</span><span style="color: #008000;"><br></span><span style="color: #008080;">145</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">short</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lineNo;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">线路编号</span><span style="color: #008000;"><br></span><span style="color: #008080;">146</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&nbsp;createTime;<br></span><span style="color: #008080;">147</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;<br></span><span style="color: #008080;">148</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;GameWorkSheetPostT&nbsp;post;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">邮寄</span><span style="color: #008000;"><br></span><span style="color: #008080;">149</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;GameWorkSheetAccountAuditT&nbsp;audit;<br></span><span style="color: #008080;">150</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;GameWorkSheetVerifyT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;verify;<br></span><span style="color: #008080;">151</span>&nbsp;<span style="color: #000000;">};<br></span><span style="color: #008080;">152</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">153</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">struct</span><span style="color: #000000;">&nbsp;GameTaskResultT{<br></span><span style="color: #008080;">154</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&nbsp;id;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">任务编号</span><span style="color: #008000;"><br></span><span style="color: #008080;">155</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&nbsp;no;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">单号&nbsp;(冗余)</span><span style="color: #008000;"><br></span><span style="color: #008080;">156</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&nbsp;gameId;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">游戏编号(冗余)</span><span style="color: #008000;"><br></span><span style="color: #008080;">157</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;result;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">处理结果</span><span style="color: #008000;"><br></span><span style="color: #008080;">158</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&nbsp;errmsg;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">提示信息&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;"><br></span><span style="color: #008080;">159</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">};<br></span><span style="color: #008080;">160</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">161</span>&nbsp;<span style="color: #000000;"></span><span style="color: #008000;">//</span><span style="color: #008000;">gtr控制服务端接口</span><span style="color: #008000;"><br></span><span style="color: #008080;">162</span>&nbsp;<span style="color: #008000;"></span><span style="color: #0000ff;">interface</span><span style="color: #000000;">&nbsp;IGameHost&nbsp;extends&nbsp;IService,ILogger,ISecure{&nbsp;&nbsp;&nbsp;&nbsp;<br></span><span style="color: #008080;">163</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;GameTaskletT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getTask();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">获取任务</span><span style="color: #008000;"><br></span><span style="color: #008080;">164</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;completeTask(GameTaskResultT&nbsp;result);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//<br></span><span style="color: #008080;">165</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;<br></span><span style="color: #008080;">166</span>&nbsp;<span style="color: #000000;">};<br></span><span style="color: #008080;">167</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">168</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">169</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">170</span>&nbsp;<span style="color: #000000;">};<br></span><span style="color: #008080;">171</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">172</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">173</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">#endif</span><span style="color: #000000;"><br></span><span style="color: #008080;">174</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">175</span>&nbsp;<span style="color: #000000;"></span></div>
<br><br><img src ="http://www.cppblog.com/socketref/aggbug/128108.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/socketref/" target="_blank">放屁阿狗 </a> 2010-09-30 00:38 <a href="http://www.cppblog.com/socketref/archive/2010/09/30/128108.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>考虑设计一种便捷的通信库</title><link>http://www.cppblog.com/socketref/archive/2010/05/10/114999.html</link><dc:creator>放屁阿狗 </dc:creator><author>放屁阿狗 </author><pubDate>Mon, 10 May 2010 07:27:00 GMT</pubDate><guid>http://www.cppblog.com/socketref/archive/2010/05/10/114999.html</guid><wfw:comment>http://www.cppblog.com/socketref/comments/114999.html</wfw:comment><comments>http://www.cppblog.com/socketref/archive/2010/05/10/114999.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/socketref/comments/commentRss/114999.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/socketref/services/trackbacks/114999.html</trackback:ping><description><![CDATA[Ice的设计思想非常好,通过slice定义之后产生一堆的通信框架代码来自动化完成对象数据的序列化<br>由于ice是基于Rpc的,底层通信细节被屏蔽掉了,甚至是连接的自动重复建立,可喜又可悲,有些应用必须要关心这些底部的通信细节,<br>如果直接用socket又嫌太麻烦了,不同的应用都是在重复的进行开发通信协议,解包和打包花销很很多的精力,这些工作都是重复的,没有技术含量而且容易出错.<br>之前开发过mtslib通信库来解决socket通信问题,使两端都是以消息包的形式进行通信,解决了socket两段buffer的管理<br>也看过ice的代码实现,slice2cpp用yacc&amp;lex进行词法语法的处理<br>对象的自动序列化这是我所感兴趣的,同ice一样提供一个通信环境,然后用户可以自定义自己的通信数据,通过idl的形式自动产生序列化代码并编译进用户工程.<br>这种方式与ice又不同在于没有那么傻瓜化,但简化了用户处理消息报的过程.<br>这样要完成一个类似ice的rpc调用也是没有那么简单<br>yacc/lex,lemon,<br><br><img src ="http://www.cppblog.com/socketref/aggbug/114999.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/socketref/" target="_blank">放屁阿狗 </a> 2010-05-10 15:27 <a href="http://www.cppblog.com/socketref/archive/2010/05/10/114999.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>完成swMap基本功能</title><link>http://www.cppblog.com/socketref/archive/2009/08/21/93983.html</link><dc:creator>放屁阿狗 </dc:creator><author>放屁阿狗 </author><pubDate>Thu, 20 Aug 2009 19:27:00 GMT</pubDate><guid>http://www.cppblog.com/socketref/archive/2009/08/21/93983.html</guid><wfw:comment>http://www.cppblog.com/socketref/comments/93983.html</wfw:comment><comments>http://www.cppblog.com/socketref/archive/2009/08/21/93983.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/socketref/comments/commentRss/93983.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/socketref/services/trackbacks/93983.html</trackback:ping><description><![CDATA[准备放弃以前项目使用的地图引擎库和Gis代码到现在已经有了2个月了<br>现在swMap能做基本demo一丁点的功能了，访问： <a target="_blank" href="http://www.sw2us.com/maps.php">www.sw2us.com/maps.php</a> 或者 <a target="_blank" href="http://220.196.42.107/main.php">http://220.196.42.107/main.php</a><br>当初考虑到放弃之前的东西考虑的问题有很多，当然有公司的知识产权问题，最主要的是之前的产品技术实在是设计的有点糟糕。做开发的知道看别人的代码并且在这基础上去发扬光大这时间很头大和痛苦的事情，特别是碰到那些原本就是比较封闭和差劲的东西。<br>凭借自己的的很多想法开始开发swMap项目，以前的东西都抛弃没有做参考，从原始地图加工设计、地图渲染服务器开发、然后就是基于Pc和Wince的客户端开发，支持本地和远程加载地图的方式，重新设计的数据存储方式除了保留简单的网格存储和搜寻，已经把地图数据进行省份的分割，而不像以前必须加载单独的一个全国地图数据包；地图网格也设计成了多网格大小形式，以便支持同一个地图文件中任意多的缩放比和地图层。<br>开发总是很辛苦，每天都是要做到夜深人静<br>学习了很多东西，思考了很多东西，反复的也有很多，最终还是凭借自己比较宽的知识面，运用了很多opensource的技术，时间和效率当然是非常重要的，所以没有自己去重新实现一些基础的东西，比如matrix就是从cairo库中直接抄过来的。<br>在用c++开发地图服务器和客户端时候也考虑了不同的通信方式和操作系统环境，尽可能的可以支持更多的运行环境。<br>原本计划在昨晚wince版本之后马上支持symbian操作系统，但对symbian的开发研究了之后让我大失所望，其开发是非常低效的且通用性能太差，后来网上得知nokia马上将抛弃symbian而怀抱linux了，这令我我马上考虑了移植linux的想法<br>很多人跟我提到静态网页地图方式，当然我不能做到像google，openlayers这么强的客户端端，也没精力去支持ogc那么的gis协议在地图服务器上，所以能演示基础的地图功能开发了php的展示端。<br>flex和sliverlight都是非常好的技术，但对于ms一直没有好感，所以flex形成了我选择另一个展示客户端的想法。<br>网上下了一堆的flex数据，前后从接触actionscript到做好swFlex客户端一共花了3天时间，发觉越来越喜欢这个东西了，看来以后的前端开发要全换成flex平台了。<br>目前做得swMap的功能非常有限，地图处理也是很简单，甚至连文本标注都没有添加，只是提供了25个图层16级别缩放比在客户端展示。<br>我想待我有时间，我将这些都会完善起来<br>原本很多带开发的技术也没有去做，比如agg，地图4叉树、RTree，A*路由算法<br>朋友给我的几个Gps模块设备这几天要调通并放置到地图上去<br><br>  <img src ="http://www.cppblog.com/socketref/aggbug/93983.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/socketref/" target="_blank">放屁阿狗 </a> 2009-08-21 03:27 <a href="http://www.cppblog.com/socketref/archive/2009/08/21/93983.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>auto_ptr/shared_ptr/week_ptr differences</title><link>http://www.cppblog.com/socketref/archive/2008/07/13/55992.html</link><dc:creator>放屁阿狗 </dc:creator><author>放屁阿狗 </author><pubDate>Sat, 12 Jul 2008 16:34:00 GMT</pubDate><guid>http://www.cppblog.com/socketref/archive/2008/07/13/55992.html</guid><wfw:comment>http://www.cppblog.com/socketref/comments/55992.html</wfw:comment><comments>http://www.cppblog.com/socketref/archive/2008/07/13/55992.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/socketref/comments/commentRss/55992.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/socketref/services/trackbacks/55992.html</trackback:ping><description><![CDATA[auto_ptr A,B A=B之后B指向内容将失效, auto_ptr属于scoped smart pointer<br><br><br><img src ="http://www.cppblog.com/socketref/aggbug/55992.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/socketref/" target="_blank">放屁阿狗 </a> 2008-07-13 00:34 <a href="http://www.cppblog.com/socketref/archive/2008/07/13/55992.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>WINCE 设置环境变量-系统加载路径</title><link>http://www.cppblog.com/socketref/archive/2008/07/04/55279.html</link><dc:creator>放屁阿狗 </dc:creator><author>放屁阿狗 </author><pubDate>Thu, 03 Jul 2008 17:24:00 GMT</pubDate><guid>http://www.cppblog.com/socketref/archive/2008/07/04/55279.html</guid><wfw:comment>http://www.cppblog.com/socketref/comments/55279.html</wfw:comment><comments>http://www.cppblog.com/socketref/archive/2008/07/04/55279.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/socketref/comments/commentRss/55279.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/socketref/services/trackbacks/55279.html</trackback:ping><description><![CDATA[{<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; TCHAR pText[] = _T("\\Windows\\0\\NandFlashPartition\\MediaLib\0\\Storage Card\\MediaLib\0\0");<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; CString strText(pText,sizeof(pText));<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; SaveMultString(HKEY_LOCAL_MACHINE,_T("Loader"),_T("SystemPath"),strText,sizeof(pText));<br><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; DeleteKey(HKEY_LOCAL_MACHINE,_T("SOFTWARE\\sample\\PLAY"));<br>&nbsp;&nbsp;&nbsp; }<br><img src ="http://www.cppblog.com/socketref/aggbug/55279.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/socketref/" target="_blank">放屁阿狗 </a> 2008-07-04 01:24 <a href="http://www.cppblog.com/socketref/archive/2008/07/04/55279.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>wxWidget的多语言</title><link>http://www.cppblog.com/socketref/archive/2008/07/04/55272.html</link><dc:creator>放屁阿狗 </dc:creator><author>放屁阿狗 </author><pubDate>Thu, 03 Jul 2008 17:19:00 GMT</pubDate><guid>http://www.cppblog.com/socketref/archive/2008/07/04/55272.html</guid><wfw:comment>http://www.cppblog.com/socketref/comments/55272.html</wfw:comment><comments>http://www.cppblog.com/socketref/archive/2008/07/04/55272.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/socketref/comments/commentRss/55272.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/socketref/services/trackbacks/55272.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: wxlocale 初始化字符语言种类&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; locale.Init(wxLANGUAGE_CHINESE );//&nbsp;&nbsp;&nbsp; locale.Init(wxLANGUAGE_FRENCH );&nbsp;&nbsp;&nbsp; wxLocale::AddCatalogLookupPathPrefix(wx...&nbsp;&nbsp;<a href='http://www.cppblog.com/socketref/archive/2008/07/04/55272.html'>阅读全文</a><img src ="http://www.cppblog.com/socketref/aggbug/55272.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/socketref/" target="_blank">放屁阿狗 </a> 2008-07-04 01:19 <a href="http://www.cppblog.com/socketref/archive/2008/07/04/55272.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>函数char2Hex()</title><link>http://www.cppblog.com/socketref/archive/2008/06/23/54318.html</link><dc:creator>放屁阿狗 </dc:creator><author>放屁阿狗 </author><pubDate>Sun, 22 Jun 2008 16:58:00 GMT</pubDate><guid>http://www.cppblog.com/socketref/archive/2008/06/23/54318.html</guid><wfw:comment>http://www.cppblog.com/socketref/comments/54318.html</wfw:comment><comments>http://www.cppblog.com/socketref/archive/2008/06/23/54318.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/socketref/comments/commentRss/54318.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/socketref/services/trackbacks/54318.html</trackback:ping><description><![CDATA[string Char2Hex(char a)<br>{<br>&nbsp;&nbsp;&nbsp; string str = "";<br>&nbsp;&nbsp;&nbsp; int n = a;<br>&nbsp;&nbsp;&nbsp; for (int i=2*sizeof(char) - 1; i&gt;=0; i--)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; str += "0123456789ABCDEF"[((n &gt;&gt; i*4) &amp; 0xF)];<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; return str;<br>}<br><img src ="http://www.cppblog.com/socketref/aggbug/54318.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/socketref/" target="_blank">放屁阿狗 </a> 2008-06-23 00:58 <a href="http://www.cppblog.com/socketref/archive/2008/06/23/54318.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>lua-快速阅读</title><link>http://www.cppblog.com/socketref/archive/2008/05/13/49689.html</link><dc:creator>放屁阿狗 </dc:creator><author>放屁阿狗 </author><pubDate>Mon, 12 May 2008 19:13:00 GMT</pubDate><guid>http://www.cppblog.com/socketref/archive/2008/05/13/49689.html</guid><wfw:comment>http://www.cppblog.com/socketref/comments/49689.html</wfw:comment><comments>http://www.cppblog.com/socketref/archive/2008/05/13/49689.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/socketref/comments/commentRss/49689.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/socketref/services/trackbacks/49689.html</trackback:ping><description><![CDATA[<br>table 是个怪物，有很多facets,类似array,map,struct,整个是个混合物，用起来也比较怪异。<br>t={1,2,3,a="gen",b=100}<br>t={[0]=1;["name"]="ultra"}<br>t.a, t.b , t[0] , t["name"]<br><br>表操作函数: <br>ipairs,pairs迭代函数<br>table.getn(t)&nbsp;&nbsp;  len of table<br><br>================================================================<br>function() 可以接受任意多的参数，如果实参数过多将丢弃，过少将默认设置为nil<br>同样可以返回多个参数<br>a,b=foo()<br><br>表作为参数传递到function<br>function rename( arg ) os.rename(arg.old,arg.new) end<br>rename{old="";new=""}<br><br>匿名函数(lambda in python )<br>foo = function(x) return x*2 end<br>局部函数 local f=function(x) ... end<br>================================================================<br>for n=start,end,step do ... end<br>while b do&nbsp;&nbsp; ... end<br>repeat do .... until<br><br>if then .. elseif then ...&nbsp; end;<br><br>有意思的语法表达式: <br>&nbsp;&nbsp;&nbsp; print a or b or c&nbsp;&nbsp; 如果a=false,尝试b...<br><br>注释: --&nbsp;&nbsp;&nbsp;&nbsp; --{ --}&nbsp; <br><br><br>字符串操作:&nbsp;&nbsp;&nbsp; .. 连接<br><br>==================================================<br>io 函数: <br>loadfile('test.lua')()&nbsp;&nbsp;&nbsp; execute external lua script<br>loadstring('print 100')()<br><br><br>代码测试: <br>=======================<br><span style="color: red;">c程序调用lua函数</span><br>c 程序:<br>void call_lua_func(){<br>&nbsp;&nbsp;&nbsp; lua_State *s = lua_open();<br>&nbsp;&nbsp;&nbsp; luaL_openlibs(s);<br>&nbsp;&nbsp;&nbsp; int c = lua_gettop(s);<br>&nbsp;&nbsp;&nbsp; luaL_dofile(s,"/nandflashpartition/test1.lua");<br>&nbsp;&nbsp;&nbsp; lua_getglobal(s,"add");<br>&nbsp;&nbsp;&nbsp; lua_pushnumber(s,0.25);<br>&nbsp;&nbsp;&nbsp; lua_pushnumber(s,8);<br>&nbsp;&nbsp;&nbsp; if( lua_pcall(s,2,1,0)){<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; std::cout&lt;&lt; lua_tostring(s,-1)&lt;&lt;std::endl;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; double r;<br>&nbsp;&nbsp;&nbsp; r = lua_tonumber(s,-1);<br>&nbsp;&nbsp;&nbsp; lua_close(s);<br>}<br>lua程序:<br>function add(x,y)<br>&nbsp;&nbsp;&nbsp; return x*y<br>end<br>--------------------------------<br><span style="color: red;">lua访问c程序空间变量</span><br><br>1.定义变量student.h<br>extern char * gender;<br>extern int class_count;<br><br>2.创建pkg文件 student.pkg<br>$#include "student.h"<br>extern char * gender;<br>extern int class_count;<br><br>3.产生tolua++存根框架<br>tolua++ -o student.pkg<br><br>4.创建lua测试代码 call_c.lua<br>print(gender)<br>print(class_count)&nbsp; 访问c 空间的变量<br><br>5.c测试代码<br>char * gender;<br>int class_count;<br>void lua_call_c(){<br>&nbsp;&nbsp;&nbsp; int&nbsp; tolua_student_open (lua_State* tolua_S);<br>&nbsp;&nbsp;&nbsp; lua_State * s = lua_open();<br>&nbsp;&nbsp;&nbsp; luaopen_base(s);<br><br>&nbsp;&nbsp;&nbsp; gender ="my gender is male!";<br>&nbsp;&nbsp;&nbsp; class_count = 100;<br>&nbsp;&nbsp;&nbsp; tolua_student_open(s);<br>&nbsp;&nbsp;&nbsp; luaL_dofile(s,"/nandflashpartition/call_c.lua");<br>&nbsp;&nbsp;&nbsp; lua_close(s);<br>}<br><br>6.build &amp;&amp; test it!<br><br><br><br>   <img src ="http://www.cppblog.com/socketref/aggbug/49689.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/socketref/" target="_blank">放屁阿狗 </a> 2008-05-13 03:13 <a href="http://www.cppblog.com/socketref/archive/2008/05/13/49689.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用 C 封装 串口数据协议，可用于流式传输</title><link>http://www.cppblog.com/socketref/archive/2007/02/23/18931.html</link><dc:creator>放屁阿狗 </dc:creator><author>放屁阿狗 </author><pubDate>Fri, 23 Feb 2007 14:54:00 GMT</pubDate><guid>http://www.cppblog.com/socketref/archive/2007/02/23/18931.html</guid><wfw:comment>http://www.cppblog.com/socketref/comments/18931.html</wfw:comment><comments>http://www.cppblog.com/socketref/archive/2007/02/23/18931.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/socketref/comments/commentRss/18931.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/socketref/services/trackbacks/18931.html</trackback:ping><description><![CDATA[#define OUT<br />#define INOUT<br />#define IN<br /><br />#define INIT_LIST_HEAD(x)    <br /><br />#define btsc_TRUE     0<br />#define btsc_FALSE    1<br />#define btsc_NULL     0<br /><br />struct list_head{<br />    struct list_head* prev,*next;<br />};<br /><br /><br />struct btsc_Property{<br />    char *         name;<br />    char *         value;        <br />};<br /><br /><br />struct btsc_Packet{<br />    /*struct list_head    list;*/<br />    struct btsc_Property**     properties; <br />    int                size;<br />    int                capacity;<br />    struct btsc_Context    *    ctx;<br />};<br /><br />struct btsc_Packet*     btsc_Packet_Alloc(struct btsc_Context* );<br />void                    btsc_Packet_Free(struct btsc_Packet*);<br /><br />struct btsc_Property*    btsc_Property_Alloc(struct btsc_Context* ,char * name,char * value);<br />void                    btsc_Property_Free(struct btsc_Property*);<br /><br /><br />struct btsc_Property*     btsc_Property_Get(struct btsc_Packet* packet,char * name);     <br />void                    btsc_Property_Append(struct btsc_Packet* packet,struct btsc_Property * );<br /><br /><br />struct btsc_Context{<br />    void (*tx)(struct btsc_Context*,unsigned char * data,int len);        <br />    int (*notifier)(struct btsc_Packet* packet);/*外部释放packet,返回NULL*/        <br />    int        packet_cached_size;<br />    int        recv_cached_capacity;                        <br />    char*    recv_buff;                                    <br />    int        recv_size;        <br />    void*    user;    // 外部数据传递                            <br />};<br /><br /><br />int     btsc_init(struct btsc_Context* IN ctx);    <br />void     btsc_cleanup(struct btsc_Context* IN ctx);<br />int        btsc_Pack(struct btsc_Context* IN ctx,struct btsc_Packet* packet,unsigned char * INOUT buff,int* INOUT size);    <br />void    btsc_Parse(struct btsc_Context* , char * data,int len);<br /><br /><br />#define BTSC_PACKET_BEGIN(ctx) {\<br />                                struct btsc_Context* _ctx_internel;\<br />                                struct btsc_Packet * _pkt ;\<br />                                _ctx_internel= (ctx);\<br />                                _pkt = btsc_Packet_Alloc(_ctx_internel);<br />                                <br />/* key is not suitable for vairable*/                                <br />#define BTSC_NEW_PROPERTY(key,value)    {\<br />                                            struct btsc_Property * _ppt =btsc_Property_Alloc(_ctx_internel,key,value);\<br />                                            btsc_Property_Append(_pkt,_ppt);\<br />                                        }<br />#define BTSC_PACKET_END()        btsc_Pack(_ctx_internel,_pkt,btsc_NULL,0);\<br />                                btsc_Packet_Free(_pkt);\<br />                                }<br /><br />#define BTSC_FOREACH(packet,ppt)    {\<br />                                    int n;\<br />                                    for(n=0;n&lt;packet-&gt;size;n++){\<br />                                        ppt = packet-&gt;properties[n];<br />#define BTSC_END_FOREACH()            }\<br />                                }<br /><br /><br /><br /><br /><br /><br /><br /><br />/*<br />    name:            btsc<br />                    serial communicating  with bluetooth and app-user<br />    desc:            pair parameter codec<br />    <br />        packet=[ key:name,...]<br />        <br />    implemented:     zhangbin ,  3 hours occupied<br />    date:            2007-01-26<br />*/<br /><br />#include &lt;stdio.h&gt;<br />#include &lt;stdlib.h&gt;<br />#include &lt;string.h&gt;<br />#ifdef _UNIX<br />#include &lt;unistd.h&gt;<br />#endif<br />#include "btsc.h"<br /><br />#define PACKET_HEAD        '&lt;'<br />#define PACKET_TAIL        '&gt;'<br />#define PROPERTY_DELIMITER    ','<br />#define PAIR_DELIMITER        '='<br />#define ESCAPE_CHAR            '\\'<br /><br /><br />int calcEscapleLength(char * str);<br />char* escape_copy(char * dest,char * src);<br />void trim_escape_copy(char * dest,char * src,int size);<br />int  calcPacketLength(struct btsc_Packet* pkt);<br />int    is_escape_char(char c);<br />void parseProperty(struct btsc_Packet * pkt,char * s,char * e);<br />void parsePacket(struct btsc_Context* ctx,char * s,char* e);<br />char*     __memchr(char * s,char* e,char c);<br /><br />char escape_ch_table[]={PACKET_HEAD,PACKET_TAIL,PROPERTY_DELIMITER,PAIR_DELIMITER,ESCAPE_CHAR,'\0'};<br /><br />struct btsc_Packet*     btsc_Packet_Alloc(struct btsc_Context* ctx){    <br />    struct btsc_Packet * pt = malloc(sizeof(struct btsc_Packet));        <br />    pt-&gt;size = 0;<br />    pt-&gt;capacity = ctx-&gt;packet_cached_size;<br />    pt-&gt;properties=malloc(pt-&gt;capacity*sizeof(struct btsc_Property*));    <br />    pt-&gt;ctx = ctx;<br />    return pt;    <br />}<br /><br />void    btsc_Packet_Free(struct btsc_Packet* pt){    <br />    struct btsc_Property** tmp;<br />    if( !pt )     return ;<br />    tmp = pt-&gt;properties;<br />    while(pt-&gt;size--){<br />        btsc_Property_Free(*tmp++);                <br />    }        <br />    if( pt-&gt;properties){<br />        free(pt-&gt;properties);  <br />    }<br />    free(pt);<br />}<br /><br /><br />struct btsc_Property*    btsc_Property_Alloc(struct btsc_Context* ctx,char * name,char * value){<br />    struct btsc_Property * ppt;<br />    printf("enter btsc_Property_Alloc()\n");<br />    ppt = malloc( sizeof( struct btsc_Property) );<br />    if(!ppt)    printf("error: malloc failed (s1)\n");<br />    ppt-&gt;name = malloc( strlen(name)+1);<br />    if( !ppt-&gt;name ) printf("error: malloc failed (s2)\n");<br />    strcpy(ppt-&gt;name,name);    <br />    ppt-&gt;value = malloc( strlen(value)+1);<br />    if( !ppt-&gt;value) printf("error: malloc failed (s3),str:%s, len: %d\n",value,strlen(value)+1);<br />    strcpy( ppt-&gt;value,value);<br />    return ppt;<br />}<br /><br />void        btsc_Property_Free(struct btsc_Property* ppt){<br />    if( !ppt )    return;<br />    free( ppt-&gt;name);<br />    free( ppt-&gt;value);<br />    free( ppt);<br />}<br /><br />/* scan pointer array */<br />struct btsc_Property*     btsc_Property_Get(struct btsc_Packet* pkt,char * name){<br />    int size;<br />    struct btsc_Property* ppt;<br />    size = pkt-&gt;size;<br />    while(size--){<br />        ppt = pkt-&gt;properties[size];<br />        if( !strcmp( name, ppt-&gt;name ) ){<br />            return ppt;/*that's ok */<br />        }<br />    }<br />    return btsc_NULL;<br />}<br /><br />/* low effeciency, memory allocation,more costs*/<br />void    btsc_Property_Append(struct btsc_Packet* pt,struct btsc_Property * ppt){<br />    struct btsc_Property** tmpppt;<br />    if( pt-&gt;size==pt-&gt;capacity){         <br />        pt-&gt;capacity += pt-&gt;ctx-&gt;packet_cached_size;    <br />        tmpppt = pt-&gt;properties;        <br />        pt-&gt;properties = malloc( pt-&gt;capacity * sizeof( struct btsc_Property**) ); <br />        memcpy( pt-&gt;properties, tmpppt, pt-&gt;size * sizeof( struct btsc_Property**));<br />        free( tmpppt); <br />    }<br />    pt-&gt;properties[pt-&gt;size++]=ppt;    <br />}<br /><br />int     btsc_init(struct btsc_Context* ctx){    <br />    ctx-&gt;packet_cached_size = 10;    <br />    if( ctx-&gt;recv_cached_capacity==0){<br />        ctx-&gt;recv_cached_capacity = 1024*2;    <br />    }<br />    ctx-&gt;recv_buff = malloc( ctx-&gt;recv_cached_capacity );<br />    ctx-&gt;recv_size = 0;<br />    return btsc_TRUE;<br />}<br /><br />void     btsc_cleanup(struct btsc_Context* ctx){<br />    free(ctx-&gt;recv_buff);    <br />}<br /><br />/*<br />**    name:    calcEscapleLength<br />**    desc:    计算含转义字符串长度<br />*/<br />int     calcEscapleLength(char * str){<br />    int len;<br />    char * pesc;<br />    len = 0;    <br />    while( *str ){<br />        pesc = escape_ch_table;<br />        while( *pesc ){<br />            if( *pesc==*str){<br />                len++;<br />                break;<br />            }<br />            pesc++;<br />        }        <br />        str++; <br />    }    <br />    return len;<br />}<br /><br /><br />char* escape_copy(char * dest,char * src){<br />    char * pesc;<br />    while( *src ){<br />        pesc = escape_ch_table;<br />        while( *pesc ){<br />            if( *pesc==*src){<br />                *dest++=ESCAPE_CHAR;<br />                break;<br />            }<br />            pesc++;<br />        }<br />        *dest++=*src++;                <br />    }    <br />    return dest;    <br />}<br /><br />void trim_escape_copy(char * dest,char * src,int size){<br />    int last_escape = btsc_FALSE;<br />    while( size--){<br />        if( *src == ESCAPE_CHAR &amp;&amp; last_escape != btsc_TRUE){        <br />            last_escape = btsc_TRUE    ;<br />            src++;<br />            continue;<br />        }<br />        last_escape = btsc_FALSE;<br />        *dest++=*src++;        <br />    }<br />}<br /><br />int       calcPacketLength(struct btsc_Packet* pkt){<br />    int len;<br />    int size;<br />    struct btsc_Property* ppt;    <br />    len = 0;<br />    size = pkt-&gt;size;<br />    while( size--){<br />        ppt = pkt-&gt;properties[size];    <br />        len+=strlen(ppt-&gt;name)+strlen(ppt-&gt;value);    <br /><br />        len+= calcEscapleLength(ppt-&gt;name);<br />        len+= calcEscapleLength(ppt-&gt;value);    <br />    }<br />    len+= pkt-&gt;size*2+1; <br />    return  len;<br />}<br /><br /><br />int        btsc_Pack(struct btsc_Context*  ctx,struct btsc_Packet* pkt,unsigned char * obuff,int* osize){<br />    struct btsc_Property* ppt;<br />    int size;<br />    int len;<br />    unsigned char * buff;<br />    char * pbuff;<br />    len = calcPacketLength( pkt);<br />    buff = malloc( len );<br />    size = pkt-&gt;size;<br />    pbuff = (char*)buff;<br />    *pbuff++=PACKET_HEAD;    <br />    while( size--){<br />        ppt = pkt-&gt;properties[size];    <br />        pbuff = escape_copy(pbuff,ppt-&gt;name);<br />        *pbuff++=PAIR_DELIMITER;<br />        pbuff = escape_copy(pbuff,ppt-&gt;value);<br />        if( size ){<br />            *pbuff++=PROPERTY_DELIMITER;            <br />        }<br />    }<br />    *pbuff = PACKET_TAIL;<br />    if( ctx-&gt;tx ){<br />        ctx-&gt;tx(ctx,buff,len);<br />    } <br />    if( obuff &amp;&amp; *osize &gt;=len){<br />        memcpy( obuff, buff ,len);<br />        *osize = len;<br />    }<br /><br />    free(buff);<br />    return btsc_TRUE;    <br />}<br /><br />/* e not in range*/<br />char*     __memchr(char * s,char* e,char c){<br />    while( s!=e){<br />        if( *s == c){<br />            return s;<br />        }        <br />        s++;<br />    }<br />    return btsc_NULL;<br />}<br /><br />int        is_escape_char(char c){<br />    return btsc_FALSE;    <br />}<br /><br />/*<br />    name: parseProperty<br />    desc: 指定内存范围中提取属性  key=&gt;value<br />        搜索包含e<br />    params:    <br />        pkt    --    消息数据包<br />        s    --    起始内存地址 <br />        e    --    结束地址 ,<br />*/<br />void parseProperty(struct btsc_Packet * pkt,char * s,char * e){<br />    char * p1,*p2;<br />    int n;<br />    struct btsc_Property*    ppt;<br />    p1 = s ;<br />    p2 = e;<br />__REPEAT:    <br />    p1 = __memchr(p1,e+1,PAIR_DELIMITER);<br />    if( p1 ){<br />        if( *(p1-1) == ESCAPE_CHAR ){<br />            p1++;<br />            goto __REPEAT;<br />        }<br />        ppt = malloc( sizeof( struct btsc_Property ));<br />        n = p1-s;         <br />        ppt-&gt;name = malloc( n+1 );<br />        memset(ppt-&gt;name,0,n+1);        <br />        trim_escape_copy(ppt-&gt;name,s,n);<br />        <br />        n =e-p1;<br />        ppt-&gt;value = malloc( n+1);<br />        memset(ppt-&gt;value,0,n+1);<br />        trim_escape_copy(ppt-&gt;value,p1+1,n);<br />        <br />        btsc_Property_Append(pkt,ppt);<br />    }<br />}<br /><br />/*<br />    name: parsePacket<br />    desc:    分解指定内存到包结构<br />            成功分解出包立刻回送到应用接收者 ( btsc_Context::notifier)<br />    param:<br />        s,e     内存地址 (处e)<br /><br />** 缓冲区还需进一步测试,包括缓冲区大小调节, 不完整协议包格式的容错<br />*/<br />void     parsePacket(struct btsc_Context* ctx,char * s,char* e){<br />    char *p,*p1,*p2;<br />    struct btsc_Packet * pkt;<br />    if( e-s &lt;=1 ){<br />        return ;<br />    }<br />    pkt = btsc_Packet_Alloc(ctx);<br />    <br />    p1 = s+1;<br />    p2 = e-1;<br />    p = p1;<br />__REPEAT:    <br />    p = __memchr(p,e,PROPERTY_DELIMITER);<br />    if( p ){<br />        if( *(p-1)==ESCAPE_CHAR){<br />            p = p+1;<br />            goto __REPEAT;<br />        }<br />        parseProperty(pkt,p1,p-1);<br />        p1 = ++p;<br />        goto __REPEAT;<br />    }<br />    /*allow one property reside in*/<br />    parseProperty(pkt,p1,e-1);<br />    if( ctx-&gt;notifier ){<br />        if(ctx-&gt;notifier(pkt)){ /* nonzero value， delete internal*/<br />            btsc_Packet_Free(pkt);            <br />        }<br />    }else{<br />       btsc_Packet_Free(pkt);    <br />    }<br />}<br /><br />void    btsc_Parse(struct btsc_Context* ctx, char * data,int size){<br />    int len ;<br />_RESTART:<br />    while( size ){<br />        len = ctx-&gt;recv_cached_capacity - ctx-&gt;recv_size;<br />        if( len &gt;0){ <br />            if( size &lt;= len){<br />                len = size;<br />                size = 0;<br />            }else{<br />                size-=len;<br />            }<br />            memcpy( ctx-&gt;recv_buff+ctx-&gt;recv_size,data,len);<br />            ctx-&gt;recv_size+=len;<br />            data+=len;<br />        }    <br />        <br />        {<br />            char * p1,*p2;            <br />_RESCAN:            <br />            p1 = ctx-&gt;recv_buff;<br />_RESCAN_HEAD:             <br />            p1 = __memchr(p1,ctx-&gt;recv_buff+ctx-&gt;recv_size,PACKET_HEAD);            <br />            if( !p1 ){ <br />                ctx-&gt;recv_size =0;<br />                if( size ){<br />                    goto _RESTART;<br />                }<br />            }<br />            if( p1&gt;ctx-&gt;recv_buff &amp;&amp; *(p1-1)==ESCAPE_CHAR){ /* "\&lt;" */<br />                p1++;<br />                goto _RESCAN_HEAD;    <br />            }<br />            <br />            /*move backward*/<br />            ctx-&gt;recv_size -=(p1-ctx-&gt;recv_buff);<br />            memmove(ctx-&gt;recv_buff,p1, ctx-&gt;recv_size);<br />            p1=ctx-&gt;recv_buff;<br />            p2 = p1+1;<br />_RESCAN_TAIL:            <br />            p2 = __memchr(p2,ctx-&gt;recv_buff+ctx-&gt;recv_size,PACKET_TAIL);<br />            if( !p2 ){<br />                if( ctx-&gt;recv_size == ctx-&gt;recv_cached_capacity ){<br />                    ctx-&gt;recv_size  = 0; <br />                }<br />                goto _RESTART;<br />            }<br />            if( *(p2-1) == ESCAPE_CHAR ){<br />                p2++;<br />                goto _RESCAN_TAIL;    <br />            }<br />            <br />            parsePacket(ctx,p1,p2);<br />            ctx-&gt;recv_size -=p2-p1+1;<br />            if( ctx-&gt;recv_size ){<br />                memmove(ctx-&gt;recv_buff,p2+1,ctx-&gt;recv_size);<br />                goto _RESCAN; <br />            }             <br />        }        <br />    }<br />}<br /><br />/*   debug */<br />#ifdef _DEBUGX<br />void tx(unsigned char * data,int len);<br />void notifier(struct btsc_Packet* packet);<br />/*初始化上下文， tx=发送处理函数,notifier=接收函数*/<br />struct btsc_Context c={tx:tx,notifier:notifier};<br /><br />/*测试数据接收并解析*/<br />void rx(){    <br />     char * msg="&lt;MSG=HELLO,NAME=SCOTT&gt;"<br />                 "&lt;MSG2=HELLO2,NAME2=SCOTT2&gt;"<br />                 "&lt;MSG3=HELLO3,NAME3=SCOTT3&gt;"; /*simulating data*/<br />    int len = strlen(msg);<br />    btsc_Parse(&amp;c,msg,len);<br />}<br />/*发送处理过程*/<br />void tx(unsigned char * buff,int len){    <br />    char *outmsg = malloc(1024*10);<br />    memset(outmsg,0,1024*10);<br />    memcpy(outmsg,buff,len);<br />    printf("encode str: %s\n",outmsg);<br />    free(outmsg);<br />    btsc_Parse(&amp;c,buff,len);<br />}<br /><br />void notifier(struct btsc_Packet* packet){<br />    struct btsc_Property * ppt;<br />    ppt = btsc_Property_Get(packet,"MSG");<br />    if(ppt)<br />        printf("property get: MSG=&gt;%s\n",ppt-&gt;value);<br />    /*遍历包内属性参数*/<br />    BTSC_FOREACH(packet,ppt);<br />    printf("packet: %s=&gt;%s\n",ppt-&gt;name,ppt-&gt;value);<br />    BTSC_END_FOREACH();<br />}<br /><br />int main(){<br />    int r;<br />    /*optional*/<br />    c.recv_cached_capacity = 1024; /*初始化接收缓冲区大小 byte*/<br />    c.packet_cached_size = 5;    /*消息包缓冲属性个数*/<br />    btsc_init(&amp;c);            /*上下文初始化*/<br />    puts("test rx()...");<br />    rx();    /*接*/<br />    puts("escape testing...");    <br />    do{<br />        /*构造消息包,并完成发送*/<br />        BTSC_PACKET_BEGIN(&amp;c);<br />        BTSC_NEW_PROPERTY("MSG","calling");<br /><br />        BTSC_PACKET_END();    <br />        usleep(1000*50);<br />        printf("&gt;&gt;seq:%d\n",r);<br />    }while(0);<br />        <br />    btsc_cleanup(&amp;c);    <br />    <br />    return 0;<br />}<br /><br /><br />#endif<br /><br /><img src ="http://www.cppblog.com/socketref/aggbug/18931.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/socketref/" target="_blank">放屁阿狗 </a> 2007-02-23 22:54 <a href="http://www.cppblog.com/socketref/archive/2007/02/23/18931.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>随便写个 线程类 玩玩</title><link>http://www.cppblog.com/socketref/archive/2007/02/23/18930.html</link><dc:creator>放屁阿狗 </dc:creator><author>放屁阿狗 </author><pubDate>Fri, 23 Feb 2007 14:47:00 GMT</pubDate><guid>http://www.cppblog.com/socketref/archive/2007/02/23/18930.html</guid><wfw:comment>http://www.cppblog.com/socketref/comments/18930.html</wfw:comment><comments>http://www.cppblog.com/socketref/archive/2007/02/23/18930.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/socketref/comments/commentRss/18930.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/socketref/services/trackbacks/18930.html</trackback:ping><description><![CDATA[#ifndef _BT_THREAD_H<br />#define _BT_THREAD_H<br /><br />#include &lt;windows.h&gt;<br /><br />class btworkThread{<br />public:<br />    btworkThread( void(*entry)(btworkThread* ,void*),void* user){        <br />        _entry = entry;        <br />        _param = user;<br />        _thandle = CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE)btworkThread::run,user,NULL,&amp;_tid);<br />    }<br />    void    stop(){<br />        _loop = false;<br />    }<br />    void    wait(){<br />        while(!_end){<br />            Sleep(20);<br />        }<br />        Sleep(20);  // ensure that thread has terminated<br />    }<br />    void    stopAndWait(){<br />        stop();wait();<br />    }<br />    bool    loop(){<br />        return _loop;<br />    }<br />    void    code_begin(){<br />        _loop = true; _begin = true;_end=false;<br />    }<br />    void    code_end(){<br />        _loop = false; _begin = false;_end=true;<br />        CloseHandle(_thandle);<br />    }<br />protected:<br />    static void    run(btworkThread* thread){<br />        thread-&gt;_entry(thread,thread-&gt;_param);<br />    }<br />private:<br />    volatile bool    _loop,_begin,_end;<br />    void (*_entry)(btworkThread* ,void*);<br />    void*    _param;<br />    DWORD    _tid;<br />    HANDLE    _thandle;<br />};<img src ="http://www.cppblog.com/socketref/aggbug/18930.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/socketref/" target="_blank">放屁阿狗 </a> 2007-02-23 22:47 <a href="http://www.cppblog.com/socketref/archive/2007/02/23/18930.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>闲来无事，写个智能指针类 玩玩</title><link>http://www.cppblog.com/socketref/archive/2007/02/23/18929.html</link><dc:creator>放屁阿狗 </dc:creator><author>放屁阿狗 </author><pubDate>Fri, 23 Feb 2007 14:39:00 GMT</pubDate><guid>http://www.cppblog.com/socketref/archive/2007/02/23/18929.html</guid><wfw:comment>http://www.cppblog.com/socketref/comments/18929.html</wfw:comment><comments>http://www.cppblog.com/socketref/archive/2007/02/23/18929.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/socketref/comments/commentRss/18929.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/socketref/services/trackbacks/18929.html</trackback:ping><description><![CDATA[    #include "btMutex.h"<br /><br />template &lt;typename T&gt;<br />class SmartHandlePtr{<br />    struct Handle{<br />        Handle(){<br />            ptr = NULL;<br />            cnt = 0;<br />        }<br />        void*    ptr;<br />        int        cnt;<br />        btLock    lock;<br />        void    inc(){<br />            btScopeLock sl(lock);<br />            cnt++;<br />        }<br />        void    dec(){<br />            btScopeLock sl(lock);<br />            cnt--;<br />        }<br />    };<br />public:<br />    SmartHandlePtr(const T* p){<br />        _ph = new Handle;<br />        _ph-&gt;ptr =(void*) p;<br />        _ph-&gt;inc();<br />    }<br /><br />    ~SmartHandlePtr(){<br />        if( _ph ){<br />            _ph-&gt;dec();<br />            if( _ph-&gt;cnt==0){<br />                T* p;<br />                p = (T*)_ph-&gt;ptr;<br />                if( p ){<br />                    delete p;<br />                }<br />                delete _ph;<br />            }            <br />        }<br />    }<br /><br />    SmartHandlePtr(const SmartHandlePtr&amp; shp){<br />        if( _ph ){<br />            _ph-&gt;dec();<br />            if( _ph-&gt;cnt==0){<br />                T* p;<br />                p = (T*)_ph-&gt;ptr;<br />                if( p){<br />                    delete p;<br />                }<br />                delete _ph;<br />            }            <br />        }<br />        _ph = _ph;<br />        _ph-&gt;inc();<br />    }<br />    bool operator==(const T* p) {<br />        return _ph-&gt;ptr == p;<br />    }<br />    bool operator==(const SmartHandlePtr&amp; shp){<br />        return _ph == shp._ph;<br />    }<br /><br />    T* operator-&gt;(){<br />        return (T*)_ph-&gt;ptr;<br />    }<br /><br />    T* get(){<br />        if( _ph &amp;&amp; _ph-&gt;ptr){<br />            return (T*)_ph-&gt;ptr;<br />        }<br />        return NULL;<br />    }<br /><br />private:<br />    Handle*    _ph;<br />};<br /><img src ="http://www.cppblog.com/socketref/aggbug/18929.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/socketref/" target="_blank">放屁阿狗 </a> 2007-02-23 22:39 <a href="http://www.cppblog.com/socketref/archive/2007/02/23/18929.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>