﻿<?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++博客-国风的Blog</title><link>http://www.cppblog.com/chugf/</link><description /><language>zh-cn</language><lastBuildDate>Mon, 06 Apr 2026 06:48:43 GMT</lastBuildDate><pubDate>Mon, 06 Apr 2026 06:48:43 GMT</pubDate><ttl>60</ttl><item><title>Google ProtoBuf开发示例</title><link>http://www.cppblog.com/chugf/archive/2012/04/13/171210.html</link><dc:creator>chugf</dc:creator><author>chugf</author><pubDate>Fri, 13 Apr 2012 03:25:00 GMT</pubDate><guid>http://www.cppblog.com/chugf/archive/2012/04/13/171210.html</guid><wfw:comment>http://www.cppblog.com/chugf/comments/171210.html</wfw:comment><comments>http://www.cppblog.com/chugf/archive/2012/04/13/171210.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/chugf/comments/commentRss/171210.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/chugf/services/trackbacks/171210.html</trackback:ping><description><![CDATA[<p style="margin-top:3.0pt;margin-right:0cm;margin-bottom:3.0pt;margin-left: 0cm;background:white"><strong><span style="font-size: 13.5pt; ">一、简介</span></strong></p>  <p style="margin-top: 3pt; margin-right: 0cm; margin-bottom: 3pt; margin-left: 0cm; text-indent: 21pt; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: white; background-position: initial initial; background-repeat: initial initial; "><span style="font-size:10.5pt;font-family:&quot;" microsoft=""  yahei'","serif";""="" arial;color:black'="">ProtocolBuffer</span><span style="font-size: 10.5pt; ">是用于结构化数据串行化的灵活、高效、自动的方法，有如</span><span style="font-size:10.5pt;font-family: &quot;" microsoft=""  yahei'","serif";color:black'="">XML</span><span style="font-size: 10.5pt; ">，不过它更小、更快、也更简单。你可以定义自己的数据结构，然后使用代码生成器生成的代码来读写这个数据结构。你甚至可以在无需重新部署程序的情况下更新数据结构。</span></p>  <p style="margin-top: 3pt; margin-right: 0cm; margin-bottom: 3pt; margin-left: 0cm; line-height: 18pt; "><strong><span style="font-size: 13.5pt;\0027Microsoft YaHei\0027&quot;;\0027Microsoft YaHei\0027&quot;">二、特点</span></strong></p>  <p style="margin-top:3.0pt;margin-right:0cm;margin-bottom:3.0pt;margin-left: 0cm;line-height:18.0pt"><span style="font-size:10.5pt;font-family: &quot;" microsoft=""  yahei'","serif"'="">ProtocolBuffer</span><span style="font-size:10.5pt;\0027Microsoft YaHei\0027&quot;;\0027Microsoft YaHei\0027&quot;">拥有多项比</span><span style="font-size:10.5pt;font-family:&quot;" microsoft=""  yahei'","serif"'="">XML</span><span style="font-size:10.5pt;\0027Microsoft YaHei\0027&quot;;\0027Microsoft YaHei\0027&quot;">更高级的串行化结构数据的特性，</span><span style="font-size:10.5pt;font-family:&quot;" microsoft=""  yahei'","serif"'="">ProtocolBuffer</span><span style="font-size:10.5pt;\0027Microsoft YaHei\0027&quot;;\0027Microsoft YaHei\0027&quot;">：</span></p>  <p style="margin-top:3.0pt;margin-right:0cm;margin-bottom:3.0pt;margin-left: 0cm;line-height:18.0pt"><span style="font-size:10.5pt;font-family: &quot;" microsoft=""  yahei'","serif"'="">&#183;&nbsp;&nbsp;&nbsp;</span><span style="font-size: 10.5pt;\0027Microsoft YaHei\0027&quot;;\0027Microsoft YaHei\0027&quot;">更简单</span></p>  <p style="margin-top:3.0pt;margin-right:0cm;margin-bottom:3.0pt;margin-left: 0cm;line-height:18.0pt"><span style="font-size:10.5pt;font-family: &quot;" microsoft=""  yahei'","serif"'="">&#183;&nbsp;&nbsp;&nbsp;</span><span style="font-size: 10.5pt;\0027Microsoft YaHei\0027&quot;;\0027Microsoft YaHei\0027&quot;">小</span><span style="font-size:10.5pt; font-family:&quot;" microsoft=""  yahei'","serif"'="">3-10</span><span style="font-size: 10.5pt;\0027Microsoft YaHei\0027&quot;;\0027Microsoft YaHei\0027&quot;">倍</span></p>  <p style="margin-top:3.0pt;margin-right:0cm;margin-bottom:3.0pt;margin-left: 0cm;line-height:18.0pt"><span style="font-size:10.5pt;font-family: &quot;" microsoft=""  yahei'","serif"'="">&#183;&nbsp;&nbsp;&nbsp;</span><span style="font-size: 10.5pt;\0027Microsoft YaHei\0027&quot;;\0027Microsoft YaHei\0027&quot;">快</span><span style="font-size:10.5pt; font-family:&quot;" microsoft=""  yahei'","serif"'="">20-100</span><span style="font-size: 10.5pt;\0027Microsoft YaHei\0027&quot;;\0027Microsoft YaHei\0027&quot;">倍</span></p>  <p style="margin-top:3.0pt;margin-right:0cm;margin-bottom:3.0pt;margin-left: 0cm;line-height:18.0pt"><span style="font-size:10.5pt;font-family: &quot;" microsoft=""  yahei'","serif"'="">&#183;&nbsp;&nbsp;&nbsp;</span><span style="font-size: 10.5pt;\0027Microsoft YaHei\0027&quot;;\0027Microsoft YaHei\0027&quot;">更少的歧义</span></p>  <p style="margin-top:3.0pt;margin-right:0cm;margin-bottom:3.0pt;margin-left: 0cm;line-height:18.0pt"><span style="font-size:10.5pt;font-family: &quot;" microsoft=""  yahei'","serif"'="">&#183;&nbsp;&nbsp;&nbsp;</span><span style="font-size: 10.5pt;\0027Microsoft YaHei\0027&quot;;\0027Microsoft YaHei\0027&quot;">可以方便的生成数据存取类</span></p>  <p style="margin-top:3.0pt;margin-right:0cm;margin-bottom:3.0pt;margin-left: 0cm;line-height:18.0pt"><span style="font-size:10.5pt;\0027Microsoft YaHei\0027&quot;;\0027Microsoft YaHei\0027&quot;">例如，让我们看看如何在</span><span style="font-size:10.5pt;font-family:&quot;" microsoft=""  yahei'","serif"'="">XML</span><span style="font-size:10.5pt;\0027Microsoft YaHei\0027&quot;;\0027Microsoft YaHei\0027&quot;">中建模</span><span style="font-size:10.5pt;font-family:&quot;" microsoft=""  yahei'","serif"'="">Person</span><span style="font-size:10.5pt;\0027Microsoft YaHei\0027&quot;;\0027Microsoft YaHei\0027&quot;">的</span><span style="font-size:10.5pt;font-family:&quot;" microsoft=""  yahei'","serif"'="">name</span><span style="font-size:10.5pt;\0027Microsoft YaHei\0027&quot;;\0027Microsoft YaHei\0027&quot;">和</span><span style="font-size:10.5pt;font-family:&quot;" microsoft=""  yahei'","serif"'="">email</span><span style="font-size:10.5pt;\0027Microsoft YaHei\0027&quot;;\0027Microsoft YaHei\0027&quot;">字段</span><span style="font-size:10.5pt;font-family:&quot;" microsoft=""  yahei'","serif"'="">:</span></p>  <p style="margin-top:3.0pt;margin-right:0cm;margin-bottom:3.0pt;margin-left: 0cm;line-height:18.0pt"><span style="font-size:10.5pt;font-family: &quot;" microsoft=""  yahei'","serif"'="">&lt;person&gt;<br /> &nbsp;&nbsp;&nbsp;&nbsp;&lt;name&gt;John Doe&lt;/name&gt;<br /> &nbsp;&nbsp;&nbsp;&nbsp;&lt;email&gt;jdoe@example.com&lt;/email&gt;<br /> &lt;/person&gt;</span></p>  <p style="margin-top:3.0pt;margin-right:0cm;margin-bottom:3.0pt;margin-left: 0cm;line-height:18.0pt"><span style="font-size:10.5pt;\0027Microsoft YaHei\0027&quot;;\0027Microsoft YaHei\0027&quot;">对应的</span><span style="font-size:10.5pt;font-family:&quot;" microsoft=""  yahei'","serif"'="">ProtocolBuffer</span><span style="font-size:10.5pt;\0027Microsoft YaHei\0027&quot;;\0027Microsoft YaHei\0027&quot;">报文则如下</span><span style="font-size:10.5pt;font-family:&quot;" microsoft=""  yahei'","serif"'="">:</span></p>  <p style="margin-top:3.0pt;margin-right:0cm;margin-bottom:3.0pt;margin-left: 0cm;line-height:18.0pt"><span style="font-size:10.5pt;font-family: &quot;" microsoft=""  yahei'","serif"'="">#ProtocolBuffer</span><span style="font-size:10.5pt;\0027Microsoft YaHei\0027&quot;;\0027Microsoft YaHei\0027&quot;">的文本表示</span><span style="font-size:10.5pt;font-family:&quot;" microsoft=""  yahei'","serif"'=""><br /> #</span><span style="font-size:10.5pt;\0027Microsoft YaHei\0027&quot;;\0027Microsoft YaHei\0027&quot;">这不是正常时使用的二进制数据</span><span style="font-size:10.5pt;font-family:&quot;" microsoft=""  yahei'","serif"'=""><br /> person {<br /> &nbsp;&nbsp;&nbsp;&nbsp;name: "John Doe"<br /> &nbsp;&nbsp;&nbsp;&nbsp;email: "jdoe@example.com"<br /> }</span></p>  <p style="margin-top: 3pt; margin-right: 0cm; margin-bottom: 3pt; margin-left: 0cm; line-height: 18pt; "><strong><span style="font-size: 13.5pt;\0027Microsoft YaHei\0027&quot;;\0027Microsoft YaHei\0027&quot;">三、开发步骤</span></strong><strong></strong></p>  <p style="margin-top:3.0pt;margin-right:0cm;margin-bottom:3.0pt;margin-left: 0cm;line-height:18.0pt"><span style="font-size:10.5pt;font-family: &quot;" microsoft=""  yahei'","serif"'="">1</span><span style="font-size:10.5pt;\0027Microsoft YaHei\0027&quot;;\0027Microsoft YaHei\0027&quot;">、下载包</span><span style="font-size:10.5pt;font-family:&quot;" microsoft=""  yahei'","serif"'="">( http://code.google.com/p/protobuf/downloads/ )</span><span style="font-size:10.5pt;\0027Microsoft YaHei\0027&quot;;\0027Microsoft YaHei\0027&quot;">，包含了</span><span style="font-size:10.5pt;font-family:&quot;" microsoft=""  yahei'","serif"'="">Java</span><span style="font-size:10.5pt;\0027Microsoft YaHei\0027&quot;;\0027Microsoft YaHei\0027&quot;">、</span><span style="font-size:10.5pt;font-family:&quot;" microsoft=""  yahei'","serif"'="">Python</span><span style="font-size:10.5pt;\0027Microsoft YaHei\0027&quot;;\0027Microsoft YaHei\0027&quot;">、</span><span style="font-size:10.5pt;font-family:&quot;" microsoft=""  yahei'","serif"'="">C++</span><span style="font-size:10.5pt;\0027Microsoft YaHei\0027&quot;;\0027Microsoft YaHei\0027&quot;">的</span><span style="font-size:10.5pt;font-family:&quot;" microsoft=""  yahei'","serif"'="">ProtocolBuffer</span><span style="font-size:10.5pt;\0027Microsoft YaHei\0027&quot;;\0027Microsoft YaHei\0027&quot;">编译器，用于生成你需要的</span><span style="font-size:10.5pt;font-family:&quot;" microsoft=""  yahei'","serif"'="">IO</span><span style="font-size:10.5pt;\0027Microsoft YaHei\0027&quot;;\0027Microsoft YaHei\0027&quot;">类。构建和安装你的编译器，跟随</span><span style="font-size:10.5pt;font-family:&quot;" microsoft=""  yahei'","serif"'="">README</span><span style="font-size:10.5pt;\0027Microsoft YaHei\0027&quot;;\0027Microsoft YaHei\0027&quot;">的指令就可以做到。</span></p>  <p style="margin-top:3.0pt;margin-right:0cm;margin-bottom:3.0pt;margin-left: 0cm;line-height:18.0pt"><span style="font-size:10.5pt;\0027Microsoft YaHei\0027&quot;;\0027Microsoft YaHei\0027&quot;">一旦你安装好了，就可以跟着编程指导</span><span style="font-size:10.5pt;font-family:&quot;" microsoft=""  yahei'","serif"'="">( http://code.google.com/apis/protocolbuffers/docs/tutorials.html )</span><span style="font-size:10.5pt;\0027Microsoft YaHei\0027&quot;;\0027Microsoft YaHei\0027&quot;">来选择语言</span><span style="font-size:10.5pt;font-family:&quot;" microsoft=""  yahei'","serif"'="">-</span><span style="font-size:10.5pt;\0027Microsoft YaHei\0027&quot;;\0027Microsoft YaHei\0027&quot;">随后就是使用</span><span style="font-size:10.5pt;font-family:&quot;" microsoft=""  yahei'","serif"'="">ProtocolBuffer</span><span style="font-size:10.5pt;\0027Microsoft YaHei\0027&quot;;\0027Microsoft YaHei\0027&quot;">创建一个简单的应用了。</span></p>  <p style="margin-top:3.0pt;margin-right:0cm;margin-bottom:3.0pt;margin-left: 0cm;line-height:18.0pt"><span style="font-size:10.5pt;font-family: &quot;" microsoft=""  yahei'","serif"'="">2</span><span style="font-size:10.5pt;\0027Microsoft YaHei\0027&quot;;\0027Microsoft YaHei\0027&quot;">、创建</span><span style="font-size:10.5pt;font-family:&quot;" microsoft=""  yahei'","serif"'="">. proto</span><span style="font-size:10.5pt;\0027Microsoft YaHei\0027&quot;;\0027Microsoft YaHei\0027&quot;">文件，文件中定义你需要做串行化的数据结构信息</span>，下面定义个<span style="font-size:10.5pt;font-family:&quot;" microsoft=""  yahei'","serif"'="">Order. Proto</span><span style="font-size:10.5pt;\0027Microsoft YaHei\0027&quot;;\0027Microsoft YaHei\0027&quot;">：</span></p>  <p style="margin-top:3.0pt;margin-right:0cm;margin-bottom:3.0pt;margin-left: 0cm;"></p><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: #800000; ">package&nbsp;xquant;<br />option&nbsp;java_package&nbsp;=&nbsp;"com.xquant";<br />option&nbsp;java_outer_classname&nbsp;=&nbsp;"Order";<br />&nbsp;<br /></span><div>message Order {</div><div>&nbsp; required int32 action = 1;</div><div>&nbsp; required string serialNo = 2; &nbsp; &nbsp; &nbsp; &nbsp;</div><div>&nbsp; required string version = 3;</div><div>&nbsp; optional string operator = 4;</div><div>&nbsp; required string code = 5;</div><div>&nbsp; required string name = 6;</div><div>&nbsp; required string price = 7;</div><div>&nbsp; required string amount = 8;</div><div>}</div></div><p>&nbsp;</p>  <p>&nbsp;</p>  <p>3<span style="font-family:宋体;">、使用</span>google<span style="font-family:宋体;">的</span>protoc.exe<span style="font-family:宋体;">生成对应的</span>C++<span style="font-family:宋体;">文件，在</span>CMD<span style="font-family:宋体;">命令框中输入如下命令（路径根据实际情况修改）：</span></p>  <p>F:\projects\c++\protobuf-2.4.1\examples&gt;protoc --cpp_out=F:\projects\c++\protobu</p>  <p>f-2.4.1\examples order.proto</p>  <p><span style="font-family:宋体;">生成文件：</span></p>  <p>order.pb.h</p>  <p>order.pb.cc</p>  <p>4<span style="font-family:宋体;">、新建</span>C++<span style="font-family:宋体;">工程</span>Demo<span style="font-family:宋体;">，把</span>order.pb.h<span style="font-family:宋体;">和</span>order.pb.cc<span style="font-family:宋体;">加入工程中，添加</span>lib<span style="font-family:宋体;">库</span></p>  <p><span style="font-size:10.0pt;font-family:Consolas;Times New Roman&quot;;color:blue;">#&nbsp;&nbsp; pragma</span><span style="font-size:10.0pt;font-family:Consolas;Times New Roman&quot;;"> <span style="color:blue">comment</span>(<span style="color:blue">lib</span>, <span style="color:#A31515">"libprotobuf.lib"</span>)</span></p>  <p><span style="font-family:宋体;">代码如下：</span></p>  <p>&nbsp;</p><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 />-->#include&nbsp;"stdafx.h"<br />#include&nbsp;&lt;iostream&gt;<br />#include&nbsp;&lt;fstream&gt;<br />#include&nbsp;&lt;<span style="color: #0000FF; ">string</span>&gt;<br />#include&nbsp;"order.pb.h"<br /><span style="color: #0000FF; ">using</span>&nbsp;<span style="color: #0000FF; ">namespace</span>&nbsp;std;<br />&nbsp;<br /><span style="color: #0000FF; ">void</span>&nbsp;initOrder(xquant::Order*&nbsp;order)&nbsp;{<br />&nbsp;&nbsp;order-&gt;set_action(100);<br />&nbsp;&nbsp;order-&gt;set_serialno("100abc");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;order-&gt;set_version("1.00.003");<br />&nbsp;&nbsp;<span style="color: #0000FF; ">string</span>&nbsp;code&nbsp;=&nbsp;"TF0001";<br />&nbsp;&nbsp;order-&gt;set_code(code);<br />&nbsp;&nbsp;<span style="color: #0000FF; ">string</span>&nbsp;name&nbsp;=&nbsp;"test";<br />&nbsp;&nbsp;order-&gt;set_name(name);<br />&nbsp;&nbsp;order-&gt;set_price("10.01");<br />&nbsp;&nbsp;order-&gt;set_amount("10000000.00");<br />}<br />&nbsp;<br /><span style="color: #0000FF; ">int</span>&nbsp;_tmain(<span style="color: #0000FF; ">int</span>&nbsp;argc,&nbsp;_TCHAR*&nbsp;argv[])<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GOOGLE_PROTOBUF_VERIFY_VERSION;<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;组装报文</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xquant::Order&nbsp;order;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;initOrder(&amp;order);<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;对象序列化为string</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">string</span>&nbsp;order_str;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;order.SerializeToString(&amp;order_str);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;&lt;&lt;&nbsp;order_str&nbsp;&lt;&lt;&nbsp;endl;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;显示调式报文</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">string</span>&nbsp;order_debug&nbsp;=&nbsp;order.DebugString();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;&lt;&lt;&nbsp;order_debug&nbsp;&lt;&lt;&nbsp;endl;<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;string反序列化为对象</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xquant::Order&nbsp;order_2;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;order_2.ParseFromString(order_str);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;&lt;&lt;&nbsp;order_2.code()&nbsp;&lt;&lt;&nbsp;endl;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;&lt;&lt;&nbsp;order_2.name()&nbsp;&lt;&lt;&nbsp;endl;<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;google::protobuf::ShutdownProtobufLibrary();<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getchar();<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />}</div><p>&nbsp;</p>  <p>&nbsp;</p><img src ="http://www.cppblog.com/chugf/aggbug/171210.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/chugf/" target="_blank">chugf</a> 2012-04-13 11:25 <a href="http://www.cppblog.com/chugf/archive/2012/04/13/171210.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MINA服务端与C++客户端通讯（2）</title><link>http://www.cppblog.com/chugf/archive/2011/07/05/150224.html</link><dc:creator>chugf</dc:creator><author>chugf</author><pubDate>Tue, 05 Jul 2011 07:31:00 GMT</pubDate><guid>http://www.cppblog.com/chugf/archive/2011/07/05/150224.html</guid><wfw:comment>http://www.cppblog.com/chugf/comments/150224.html</wfw:comment><comments>http://www.cppblog.com/chugf/archive/2011/07/05/150224.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.cppblog.com/chugf/comments/commentRss/150224.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/chugf/services/trackbacks/150224.html</trackback:ping><description><![CDATA[<span class="Apple-style-span" style="color: #333333; font-family: Arial; line-height: 26px; "><p>Java与C++通讯还有编码转码的问题存在，假设通讯编码采用UTF-8</p><p>C++客户端发送时需要转码成UTF-8编码，接收服务端应答消息后再转回Unicode或者GBK编码</p><p>下面给出完成的C++客户端通讯示例：</p></span><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: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;Transcoding(LPCTSTR&nbsp;src,&nbsp;UINT&nbsp;srcCode,&nbsp;</span><span style="color: #0000FF; ">string</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">&nbsp;dest,&nbsp;UINT&nbsp;destCode)&nbsp;&nbsp;&nbsp;<br />{&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;len&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;MultiByteToWideChar(srcCode,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;src,&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,&nbsp;NULL,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;WCHAR</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;srcTemp&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;WCHAR[len];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;MultiByteToWideChar(srcCode,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;src,&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,&nbsp;srcTemp,&nbsp;len);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;len&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;WideCharToMultiByte(destCode,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;srcTemp,&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,&nbsp;NULL,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;NULL,&nbsp;NULL);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;destTemp&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">[len];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;WideCharToMultiByte(destCode,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;srcTemp,&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,&nbsp;destTemp,&nbsp;len,&nbsp;NULL,&nbsp;NULL);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;dest&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;destTemp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;delete&nbsp;[]srcTemp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;delete&nbsp;[]destTemp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />}&nbsp;&nbsp;<br />&nbsp;&nbsp;<br /></span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;_tmain(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;argc,&nbsp;_TCHAR</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;argv[])&nbsp;&nbsp;<br />{&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;client&nbsp;connect&nbsp;&nbsp;</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;CXSocket&nbsp;client;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;client.initWinSocket();&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;client.setAddress(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">127.0.0.1</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;client.setPort(</span><span style="color: #000000; ">1234</span><span style="color: #000000; ">);&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;client.setProtoType(TCP);&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;ret&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;client.connect();&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(ret&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">)&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getchar();&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;加通讯协议头demo&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;client&nbsp;send&nbsp;&nbsp;</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">&nbsp;send[]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;{</span><span style="color: #000000; ">"</span><span style="color: #000000; ">CXSocket&nbsp;第一个测试用例.</span><span style="color: #000000; ">"</span><span style="color: #000000; ">};&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">string</span><span style="color: #000000; ">&nbsp;utf8;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;Transcoding(send,&nbsp;CP_ACP,&nbsp;utf8,&nbsp;CP_UTF8);&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;XNET::TPacketHeader&nbsp;sendHeader;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;sendHeader.m_HeaderSig&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0xABCD</span><span style="color: #000000; ">;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;swap_2(sendHeader.m_HeaderSig);&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;sendHeader.m_Length&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">)utf8.length();&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;swap_4(sendHeader.m_Length);&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">&nbsp;buffer[</span><span style="color: #000000; ">1024</span><span style="color: #000000; ">]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;{</span><span style="color: #000000; ">0</span><span style="color: #000000; ">};&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;memcpy(buffer,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">sendHeader,&nbsp;XNET::TCP_HEADLEN);&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;memcpy(</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">buffer[XNET::TCP_HEADLEN],&nbsp;utf8.c_str(),&nbsp;utf8.length());&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;client.sendBuf(buffer,&nbsp;(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">)(XNET::TCP_HEADLEN&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;utf8.length()));&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;client&nbsp;recv&nbsp;&nbsp;</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;XNET::TPacketHeader&nbsp;recvHeader;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;client.receiveBuf(</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">recvHeader,&nbsp;XNET::TCP_HEADLEN);&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;swap_2(recvHeader.m_HeaderSig);&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;swap_4(recvHeader.m_Length);&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;recv&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">[recvHeader.m_Length&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">];&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;memset(recv,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;recvHeader.m_Length&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">);&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;client.receiveBuf(recv,&nbsp;recvHeader.m_Length);&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">string</span><span style="color: #000000; ">&nbsp;ansi;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;Transcoding(recv,&nbsp;CP_UTF8,&nbsp;ansi,&nbsp;CP_ACP);&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;client.close();&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;client.uninitWinSocket();&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;getchar();&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;&nbsp;&nbsp;<br />} &nbsp;</span></div><p style="color: #333333; font-family: Arial; line-height: 26px; ">CXSocket类下载地址：<a href="http://code.google.com/p/x-net/" style="color: #336699; text-decoration: none; ">http://code.google.com/p/x-net/</a></p><p style="color: #333333; font-family: Arial; line-height: 26px; ">MINA服务端Demo下载地址：<a href="http://download.csdn.net/source/3418326" style="color: #336699; text-decoration: none; ">http://download.csdn.net/source/3418326</a></p><img src ="http://www.cppblog.com/chugf/aggbug/150224.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/chugf/" target="_blank">chugf</a> 2011-07-05 15:31 <a href="http://www.cppblog.com/chugf/archive/2011/07/05/150224.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MINA服务端与C++客户端通讯（1）</title><link>http://www.cppblog.com/chugf/archive/2011/07/05/150223.html</link><dc:creator>chugf</dc:creator><author>chugf</author><pubDate>Tue, 05 Jul 2011 07:27:00 GMT</pubDate><guid>http://www.cppblog.com/chugf/archive/2011/07/05/150223.html</guid><wfw:comment>http://www.cppblog.com/chugf/comments/150223.html</wfw:comment><comments>http://www.cppblog.com/chugf/archive/2011/07/05/150223.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/chugf/comments/commentRss/150223.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/chugf/services/trackbacks/150223.html</trackback:ping><description><![CDATA[<span class="Apple-style-span" style="color: #333333; font-family: Arial; line-height: 26px; "><p><span style="font-size: 16px; ">最近学习了<span style="font-family: Verdana, Simsun, sans-serif; line-height: 21px; ">Apache MINA</span>通讯，在使用过程中碰到了一些问题，记录下一些心得。</span><span style="font-size: 16px; "></span></p><p><span style="font-size: 16px; ">在服务端和客户端都使用MINA提供的库时，通讯一切正常，当我把客户端改为C++代码时，发现客户端发送给服务端的二进制流中的整形数据，位置被倒置了。</span></p><p><span style="font-size: 16px; "><strong>C++客户端16进制 &nbsp;：0x00000013</strong></span></p><p><span style="font-size: 16px; "><strong>MINA服务端16进制：0x13000000</strong></span></p><p><span style="font-size: 16px; ">查询了网上资料后才知道J</span><span style="font-family: Arial, 宋体; line-height: 18px; "><span style="font-size: 16px; ">ava在所有平台上都默认是big-endian，而</span><span style="font-family: Arial, 宋体; line-height: 18px; "><span style="font-size: 16px; ">C++<span style="font-family: Arial, 宋体; line-height: 18px; ">在不同的平台上有不同的字节序, X86上是little-endian, solaris上是big-endian。</span></span></span></span></p><p><span style="font-family: Arial, 宋体; font-size: 16px; "><span style="line-height: 18px; ">注意问题：</span></span></p><p><span style="font-family: Arial, 宋体; font-size: 16px; "><span style="line-height: 18px; "><span style="font-family: Arial, 宋体; line-height: 18px; ">1、字节序</span></span></span></p><p><span style="font-family: Arial, 宋体; font-size: 16px; "><span style="line-height: 18px; "><span style="font-family: Arial, 宋体; line-height: 18px; ">C++在不同的平台上有不同的字节序, X86上是little-endian, solaris上是big-endian; 而java在所有平台上都默认是big-endian, 所以在传输诸如short,int,long数据时要在C++转换成网络序(big-endian)<br />2、字符编码</span></span></span></p><p><span style="font-family: Arial, 宋体; font-size: 16px; "><span style="line-height: 18px; "><span style="font-family: Arial, 宋体; line-height: 18px; ">C++上最普遍的是采用mbcs, 而java上是用unicode(并且和标准的unicode还有些区别,可以参考java文档), 所以除非必须否则不要传字符串, 可以传文本文件代替, 一定要传的话只能自己转换了<br />3、 内存对齐, 在C/C++的网络通信程序中经常采用读写结构体的方式方便地交换数据, 但是不注意的话结构体内很可能有空隙, 比如struct A{ int a; char c }; struct B{ char a; int b }; 这两个结构体内都有空隙, 而如果不说明空隙的存在java程序是不会知道的, 就会导致双方解析时出错. 要消除空隙应该小心地安排结构体的成员, 不推荐使用#pragma pach(1), 因为没有通用性<br />4、 位域</span></span></span></p><p><span style="font-family: Arial, 宋体; font-size: 16px; "><span style="line-height: 18px; "><span style="font-family: Arial, 宋体; line-height: 18px; ">除非小心安排, 否则位域导致的结构体大小与平台相关, int a:4所占用的字节随平台和编译器变化(char a:4相对稳定占1字节)<br />5、 (可能平台相关)传送与接收速度不同</span></span></span><span style="font-family: Arial, 宋体; line-height: 18px; font-size: 16px; ">当C++向java传送一个大一些的数据时, 可能C++一边已经传完退出了, 而java那边还没收完, 导致最后的一部分数据丢失. 所以项目中采用了简单的确认机制, 任何一方接收完数据就回送1字节的确认, 以防止C++过早退出</span></p><p><span style="font-family: Arial, 宋体; font-size: 16px; "><span style="line-height: 18px; "><span style="font-family: Arial, 宋体; line-height: 18px; ">6、(可能平台相关)java在同C++建立连接后以及在C++向java传送完一段数据后, java若向C++传送一段数据则第一次传送的数据C++只能收到一个字节, 第一次过后恢复正常</span><br /></span></span></p><p><span style="font-family: Arial, 宋体; font-size: 16px; "><span style="line-height: 18px; "><span style="font-family: Arial, 宋体; line-height: 18px; "><br /></span></span></span></p><p><span style="font-family: Arial, 宋体; font-size: 16px; "><span style="line-height: 18px; "><span style="font-family: Arial, 宋体; line-height: 18px; ">C++整形转换代码如下：</span></span></span></p></span><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: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;swap_4(unsigned&nbsp;</span><span style="color: #0000FF; ">long</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">x)&nbsp;&nbsp;<br />{&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;x&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;(x&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">24</span><span style="color: #000000; ">)&nbsp;</span><span style="color: #000000; ">|</span><span style="color: #000000; ">&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;((x&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">8</span><span style="color: #000000; ">)&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0x00ff0000u</span><span style="color: #000000; ">)&nbsp;</span><span style="color: #000000; ">|</span><span style="color: #000000; ">&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;((x&nbsp;</span><span style="color: #000000; ">&gt;&gt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">8</span><span style="color: #000000; ">)&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0x0000ff00u</span><span style="color: #000000; ">)&nbsp;</span><span style="color: #000000; ">|</span><span style="color: #000000; ">&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;(x&nbsp;</span><span style="color: #000000; ">&gt;&gt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">24</span><span style="color: #000000; ">);&nbsp;&nbsp;<br />}&nbsp;&nbsp;<br />&nbsp;&nbsp;<br /></span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;_tmain(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;argc,&nbsp;_TCHAR</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;argv[])&nbsp;&nbsp;<br />{&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;</span><span style="color: #0000FF; ">long</span><span style="color: #000000; ">&nbsp;len&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">19</span><span style="color: #000000; ">;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;swap_4(len);&nbsp;&nbsp;<br />}</span></div><img src ="http://www.cppblog.com/chugf/aggbug/150223.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/chugf/" target="_blank">chugf</a> 2011-07-05 15:27 <a href="http://www.cppblog.com/chugf/archive/2011/07/05/150223.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>IOCP完成端口源代码</title><link>http://www.cppblog.com/chugf/archive/2011/07/04/150102.html</link><dc:creator>chugf</dc:creator><author>chugf</author><pubDate>Mon, 04 Jul 2011 03:40:00 GMT</pubDate><guid>http://www.cppblog.com/chugf/archive/2011/07/04/150102.html</guid><wfw:comment>http://www.cppblog.com/chugf/comments/150102.html</wfw:comment><comments>http://www.cppblog.com/chugf/archive/2011/07/04/150102.html#Feedback</comments><slash:comments>13</slash:comments><wfw:commentRss>http://www.cppblog.com/chugf/comments/commentRss/150102.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/chugf/services/trackbacks/150102.html</trackback:ping><description><![CDATA[<span class="Apple-style-span" style="color: #333333; font-family: Arial; line-height: 26px; "><p>关于IOCP完成端口的介绍有很多，这里就不介绍概念了。</p><p>如果不考虑跨平台问题，在Windows下IOCP（I/O Completion Port，I/O完成端口）是性能最好的一种I/O模型。</p><p>以下是本人开发的IO完成端口服务器/客户端介绍：<br /></p><p>名称：x-net</p><p>版本：1.0.0</p><p>特点：针对TCP网络通讯进行封装，使用widows下效率最高的IOCP通讯方式，工程包括服务端和客户端。<br />&nbsp; &nbsp; &nbsp; 可应用于即时网络通讯、跨平台网络通讯等。<br />功能：<br />&nbsp; &nbsp; &nbsp; 1、支持多用户并发连接通讯，理论支持10000+在线用户，实际运行5000+左右<br />&nbsp; &nbsp; &nbsp; 2、支持自定义通讯头协议，代码里实现了一个简单的组包拆包功能<br />&nbsp; &nbsp; &nbsp; 3、支持转发通讯包服务<br />&nbsp; &nbsp; &nbsp; 4、支持文件下载上传<br /><br />说明:<br />使用了开源日志库log4cplus，网址：<a href="http://log4cplus.sourceforge.net/" style="color: #336699; text-decoration: none; ">http://log4cplus.sourceforge.net/</a><br />简单用例见test目录：<br />test.vcxproj &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; -- VS2010工程<br />test_2005.vcproj &nbsp; -- VS2005工程</p><p>源代码下载地址：<a href="http://code.google.com/p/x-net/" style="color: #336699; text-decoration: none; ">http://code.google.com/p/x-net/</a></p></span><img src ="http://www.cppblog.com/chugf/aggbug/150102.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/chugf/" target="_blank">chugf</a> 2011-07-04 11:40 <a href="http://www.cppblog.com/chugf/archive/2011/07/04/150102.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++经典开源项目</title><link>http://www.cppblog.com/chugf/archive/2011/06/24/149379.html</link><dc:creator>chugf</dc:creator><author>chugf</author><pubDate>Fri, 24 Jun 2011 05:59:00 GMT</pubDate><guid>http://www.cppblog.com/chugf/archive/2011/06/24/149379.html</guid><wfw:comment>http://www.cppblog.com/chugf/comments/149379.html</wfw:comment><comments>http://www.cppblog.com/chugf/archive/2011/06/24/149379.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/chugf/comments/commentRss/149379.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/chugf/services/trackbacks/149379.html</trackback:ping><description><![CDATA[<div style="color: #000000; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px; margin-top: 8px; margin-right: 8px; margin-bottom: 8px; margin-left: 8px; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: #ffffff; line-height: normal; "><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">个人觉得比较经典的<span lang="EN-US">C++</span>&nbsp;开源项目，整理如下：</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span lang="EN-US">&nbsp;</span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span mce_name="strong" mce_style="font-weight: bold;" class="Apple-style-span" style="font-weight: bold; "><span mce_style="color: green;" lang="EN-US" style="color: green; ">1</span>&nbsp;<span mce_style="color: green;" style="color: green; ">、<span lang="EN-US">log4cplus</span></span></span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span lang="EN-US">log4cplus</span>&nbsp;是<span lang="EN-US">C++</span>&nbsp;编写的开源的日志系统<span lang="EN-US">,</span>&nbsp;功能非常全面。<span lang="EN-US">C++</span>&nbsp;版的<span lang="EN-US">log4j</span><span mce_name="strong" mce_style="font-weight: bold;" class="Apple-style-span" style="font-weight: bold; "></span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span mce_name="strong" mce_style="font-weight: bold;" class="Apple-style-span" style="font-weight: bold; "></span>网址：<span lang="EN-US"><a href="http://log4cplus.sourceforge.net/" mce_href="http://log4cplus.sourceforge.net/">http://log4cplus.sourceforge.net/</a></span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span lang="EN-US">&nbsp;</span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span mce_name="strong" mce_style="font-weight: bold;" class="Apple-style-span" style="font-weight: bold; "><span mce_style="color: green;" lang="EN-US" style="color: green; ">2</span>&nbsp;<span mce_style="color: green;" style="color: green; ">、<span lang="EN-US">Glog</span></span></span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span lang="EN-US">Google Glog&nbsp;</span>是一个<span lang="EN-US">C++</span>&nbsp;语言的应用级日志记录框架，提供了<span lang="EN-US">&nbsp;C++&nbsp;</span>风格的流操作和各种助手宏。</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span lang="EN-US">SVN</span>&nbsp;：<span lang="EN-US"><a href="http://google-glog.googlecode.com/svn/trunk" mce_href="http://google-glog.googlecode.com/svn/trunk">http://google-glog.googlecode.com/svn/trunk</a></span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span lang="EN-US">&nbsp;</span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span mce_name="strong" mce_style="font-weight: bold;" class="Apple-style-span" style="font-weight: bold; "><span mce_style="color: green;" lang="EN-US" style="color: green; ">3</span>&nbsp;<span mce_style="color: green;" style="color: green; ">、<span lang="EN-US">memcached</span></span></span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span lang="EN-US">memcached</span>&nbsp;是一套分布式的快取系统，当初是<span lang="EN-US">Danga Interactive</span>&nbsp;为了<span lang="EN-US">LiveJournal</span>&nbsp;所发展的，但目前被许多软件（如<span lang="EN-US">MediaWiki</span>&nbsp;）所使用。这是一套开放源代码软件，以<span lang="EN-US">BSD license</span>&nbsp;授权释出。</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span lang="EN-US">memcached</span>&nbsp;缺乏认证以及安全管制，这代表应该将<span lang="EN-US">memcached</span>&nbsp;服务器放置在防火墙后。</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span lang="EN-US">SVN</span>&nbsp;：<span lang="EN-US"><a href="http://code.sixapart.com/svn/memcached" mce_href="http://code.sixapart.com/svn/memcached">http://code.sixapart.com/svn/memcached</a></span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span lang="EN-US">&nbsp;</span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span lang="EN-US"><br /><span mce_name="strong" mce_style="font-weight: bold;" class="Apple-style-span" style="font-weight: bold; "><span mce_style="font-family: 宋体; color: green;" style="font-family: 宋体; color: green; ">4</span>&nbsp;</span></span><span mce_name="strong" mce_style="font-weight: bold;" class="Apple-style-span" style="font-weight: bold; "><span mce_style="font-family: 宋体; color: green;" style="font-family: 宋体; color: green; ">、</span>&nbsp;</span><span mce_name="strong" mce_style="font-weight: bold;" class="Apple-style-span" style="font-weight: bold; "><span mce_style="color: green;" lang="EN-US" style="color: green; ">TinyXML</span></span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span lang="EN-US">TinyXML</span>&nbsp;是目前非常流行的一款基于<span lang="EN-US">DOM</span>&nbsp;模型的<span lang="EN-US">XML</span>&nbsp;解析器，简单易用且小巧 玲珑，非常适合存储简单数据，配置文件，对象序列化等数据量不是很大的操作</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">网址：<span lang="EN-US"><a href="http://www.grinninglizard.com/tinyxml/" mce_href="http://www.grinninglizard.com/tinyxml/">http://www.grinninglizard.com/tinyxml/</a></span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span lang="EN-US">&nbsp;</span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span mce_name="strong" mce_style="font-weight: bold;" class="Apple-style-span" style="font-weight: bold; "><span mce_style="color: green;" lang="EN-US" style="color: green; ">5</span>&nbsp;<span mce_style="color: green;" style="color: green; ">、<span lang="EN-US">OpenSSL</span></span></span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span lang="EN-US">OpenSSL</span>&nbsp;包含一个命令行工具用来完成<span lang="EN-US">OpenSSL</span>&nbsp;库中的所有功能，更好的是，它可能已经安装到你的系统中了。</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span lang="EN-US">OpenSSL</span>&nbsp;是一个强大的安全套接字层密码库，<span lang="EN-US">Apache</span>&nbsp;使用它加密<span lang="EN-US">HTTPS</span>&nbsp;，<span lang="EN-US">OpenSSH</span>&nbsp;使用它加密<span lang="EN-US">SSH</span>&nbsp;，但是，你不应该只将其作为一个库来使用，它还是一个多用途的、跨平台的密码工具。</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">网址：<span lang="EN-US"><a href="http://www.openssl.org/source/" mce_href="http://www.openssl.org/source/">http://www.openssl.org/source/</a></span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span lang="EN-US">&nbsp;</span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span mce_name="strong" mce_style="font-weight: bold;" class="Apple-style-span" style="font-weight: bold; "><span mce_style="color: green;" lang="EN-US" style="color: green; ">6</span>&nbsp;<span mce_style="color: green;" style="color: green; ">、<span lang="EN-US">xerces</span></span></span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">Xerces是由Apache组织所推动的一项XML文档解析开源项目,它目前有多种语言版本包括JAVA、C++、PERL、COM等。</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span lang="EN-US">&nbsp;</span>&nbsp;网址<span lang="EN-US">：<a href="http://xerces.apache.org/xerces-c/download.cgi" mce_href="http://xerces.apache.org/xerces-c/download.cgi">http://xerces.apache.org/xerces-c/download.cgi</a></span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span lang="EN-US">&nbsp;</span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span mce_name="strong" mce_style="font-weight: bold;" class="Apple-style-span" style="font-weight: bold; "><span mce_style="color: green;" lang="EN-US" style="color: green; ">7</span>&nbsp;<span mce_style="color: green;" style="color: green; ">、<span lang="EN-US">Boost</span></span></span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span lang="EN-US">Boost</span>&nbsp;库是一个经过千锤百炼、可移植、提供源代码的<span lang="EN-US">C++</span>&nbsp;库，作为标准库的后备，是<span lang="EN-US">C++</span>&nbsp;标准化进程的发动机之一。<span lang="EN-US">&nbsp;Boost</span>&nbsp;库由<span lang="EN-US">C++</span>标准委员会库工作组成员发起，在<span lang="EN-US">C++</span>&nbsp;社区中影响甚大，其成员已近<span lang="EN-US">2000</span>&nbsp;人。<span lang="EN-US">&nbsp;Boost</span>&nbsp;库为我们带来了最新、最酷、最实用的技术，是不折不扣的<span lang="EN-US">&#8220;</span>&nbsp;准<span lang="EN-US">&#8221;</span>&nbsp;标准库。</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">网址：<span lang="EN-US"><a href="http://www.boost.org/" mce_href="http://www.boost.org/">http://www.boost.org/</a></span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><br /></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span mce_name="strong" mce_style="font-weight: bold;" class="Apple-style-span" style="font-weight: bold; "><span mce_style="color: #008000;" style="color: #008000; "><span lang="EN-US">8、Zlib</span></span></span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">Zlib 软件包包含 zlib 库，很多程序中的压缩或者解压缩函数都会用到这个库</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">网址：<a href="http://www.zlib.net/" mce_href="http://www.zlib.net/">http://www.zlib.net/</a></p><p class="MsoNormal" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span lang="EN-US">&nbsp;</span></p></div><img src ="http://www.cppblog.com/chugf/aggbug/149379.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/chugf/" target="_blank">chugf</a> 2011-06-24 13:59 <a href="http://www.cppblog.com/chugf/archive/2011/06/24/149379.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>