﻿<?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++博客-Error-文章分类-网狐棋牌源码分析</title><link>http://www.cppblog.com/Error/category/17009.html</link><description /><language>zh-cn</language><lastBuildDate>Fri, 19 Oct 2012 11:00:56 GMT</lastBuildDate><pubDate>Fri, 19 Oct 2012 11:00:56 GMT</pubDate><ttl>60</ttl><item><title>协议分析-服务器接收</title><link>http://www.cppblog.com/Error/articles/150207.html</link><dc:creator>Enic</dc:creator><author>Enic</author><pubDate>Tue, 05 Jul 2011 05:15:00 GMT</pubDate><guid>http://www.cppblog.com/Error/articles/150207.html</guid><wfw:comment>http://www.cppblog.com/Error/comments/150207.html</wfw:comment><comments>http://www.cppblog.com/Error/articles/150207.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Error/comments/commentRss/150207.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Error/services/trackbacks/150207.html</trackback:ping><description><![CDATA[<p>在服务器哪里,网络通信有两个接口:IClientSocketSink IAttemperEngineSink<br />IClientSocketSink一般用用于网络服务器之间通信<br />IAttemperEngineSink用于和客户端通信</p>
<p>// logon server<br />CAttemperEngineSink::OnEventSocketRead<br />&nbsp;&nbsp;&nbsp; MDM_GP_LOGON&nbsp; //登录消息<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SUB_GP_LOGON_ACCOUNTS&nbsp; //帐号登录<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CMD_GP_LogonByAccounts<br />&nbsp;&nbsp;SUB_GP_LOGON_USERID&nbsp; //ID 登录<br />&nbsp;&nbsp;&nbsp;CMD_GP_LogonByUserID<br />&nbsp;&nbsp;SUB_GP_REGISTER_ACCOUNTS&nbsp; //注册帐号<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CMD_GP_RegisterAccounts<br />&nbsp;&nbsp;&nbsp;<br />// gamer server<br />CAttemperEngineSink::OnEventSocketRead<br />&nbsp;MDM_GR_LOGON&nbsp; //登录消息<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SUB_GP_LOGON_ACCOUNTS&nbsp; //帐号登录<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CMD_GP_LogonByAccounts<br />&nbsp;&nbsp;SUB_GP_LOGON_USERID&nbsp; //ID 登录<br />&nbsp;&nbsp;&nbsp;CMD_GP_LogonByUserID<br />&nbsp;MDM_GR_USER&nbsp; //用户消息<br />&nbsp;&nbsp;SUB_GR_USER_SIT_REQ&nbsp; //坐下桌子<br />&nbsp;&nbsp;SUB_GR_USER_LOOKON_REQ&nbsp; //旁观桌子<br />&nbsp;&nbsp;&nbsp;CMD_GR_UserSitReq<br />&nbsp;&nbsp;SUB_GR_USER_STANDUP_REQ&nbsp; //起立请求<br />&nbsp;&nbsp;SUB_GR_USER_LEFT_GAME_REQ&nbsp; //强退请求<br />&nbsp;&nbsp;SUB_GR_USER_CHAT&nbsp; //聊天消息<br />&nbsp;&nbsp;&nbsp;CMD_GR_UserChat<br />&nbsp;&nbsp;SUB_GR_USER_WISPER&nbsp; //私语消息<br />&nbsp;&nbsp;&nbsp;CMD_GR_Wisper<br />&nbsp;&nbsp;SUB_GR_USER_RULE&nbsp; //用户规则<br />&nbsp;&nbsp;&nbsp;CMD_GR_UserRule<br />&nbsp;&nbsp;SUB_GR_USER_INVITE_REQ&nbsp; //邀请用户<br />&nbsp;&nbsp;&nbsp;CMD_GR_UserInviteReq<br />&nbsp;MDM_GR_MANAGER&nbsp; //管理消息<br />&nbsp;&nbsp;SUB_GR_SEND_WARNING:&nbsp;//警告消息<br />&nbsp;&nbsp;&nbsp;CMD_GR_SendWarning<br />&nbsp;&nbsp;SUB_GR_LOOK_USER_IP:&nbsp;//查看地址<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CMD_GR_LookUserIP<br />&nbsp;&nbsp;SUB_GR_KILL_USER:&nbsp;&nbsp;//踢出用户<br />&nbsp;&nbsp;&nbsp;CMD_GR_KillUser<br />&nbsp;&nbsp;SUB_GR_LIMIT_ACCOUNS:&nbsp;//禁用帐户<br />&nbsp;&nbsp;&nbsp;CMD_GR_LimitAccounts<br />&nbsp;&nbsp;SUB_GR_SET_USER_RIGHT:&nbsp;//用户权限<br />&nbsp;&nbsp;&nbsp;CMD_GR_SetUserRight<br />&nbsp;&nbsp;SUB_GR_SEND_MESSAGE:&nbsp;//发送消息<br />&nbsp;&nbsp;&nbsp;CMD_GR_SendMessage<br />&nbsp;&nbsp;SUB_GR_OPTION_SERVER:&nbsp;//房间设置<br />&nbsp;&nbsp;&nbsp;CMD_GR_OptionServer<br />&nbsp;MDM_GF_FRAME&nbsp; //框架消息<br />&nbsp;MDM_GF_GAME&nbsp; //游戏消息<br />&nbsp;&nbsp;</p>
<p>// center server<br />CAttemperEngineSink::OnEventSocketRead<br />&nbsp;MDM_CS_SERVER_LIST:&nbsp; //列表消息<br />&nbsp;&nbsp;SUB_CS_GET_SERVER_LIST:&nbsp; //获取列表<br />&nbsp;MDM_CS_SERVER_MANAGER:&nbsp;//房间管理&nbsp;<br />&nbsp;&nbsp;SUB_CS_REG_GAME_SERVER:&nbsp; //房间注册<br />&nbsp;&nbsp;SUB_CS_UNREG_GAME_SERVER:&nbsp; //注销房间<br />&nbsp;&nbsp;SUB_CS_SERVER_ONLINE_COUNT:&nbsp; //更新人数</p><img src ="http://www.cppblog.com/Error/aggbug/150207.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Error/" target="_blank">Enic</a> 2011-07-05 13:15 <a href="http://www.cppblog.com/Error/articles/150207.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>协议分析：GamePlaza的网络协议（收）</title><link>http://www.cppblog.com/Error/articles/150109.html</link><dc:creator>Enic</dc:creator><author>Enic</author><pubDate>Mon, 04 Jul 2011 05:48:00 GMT</pubDate><guid>http://www.cppblog.com/Error/articles/150109.html</guid><wfw:comment>http://www.cppblog.com/Error/comments/150109.html</wfw:comment><comments>http://www.cppblog.com/Error/articles/150109.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Error/comments/commentRss/150109.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Error/services/trackbacks/150109.html</trackback:ping><description><![CDATA[<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000">通过对基础库的分析可以知道，客户端通过IClientSocket、IClientSocketSink和服务器通讯。<br />现在把问题集中起来，只分析客户端和服务器之间的接口，也就是IO<br />当前分析的模式是GamePlaza<br />CPlazaViewItem&nbsp;&nbsp;CRoomViewItem这两个实现了IClientSocketSink接口，也就是说他们能接受服务器消息；<br />IClientSocketSink能响应三个事件OnSocketConnect&nbsp;&nbsp;OnSocketRead&nbsp;&nbsp;OnSocketClose<br />主要的数据交换应该是依赖OnSocketRead<br />CPlazaViewItem<br />&nbsp;&nbsp;&nbsp;&nbsp;OnSocketRead&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MDM_GP_LOGON&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">登陆消息</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SUB_GP_LOGON_SUCCESS&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">登陆成功&nbsp;&nbsp;</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CMD_GP_LogonSuccess<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(接下来的叫扩展信息)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DTP_USER_ACCOUNTS&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">用户帐户</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;数据由DataDescribe描述<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DTP_USER_PASS&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">用户密码</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;数据由DataDescribe描述<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DTP_USER_GROUP_NAME&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">社团名字</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;数据由DataDescribe描述<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SUB_GP_LOGON_ERROR&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">登陆失败</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MDM_GP_SERVER_LIST&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">列表消息</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SUB_GP_LIST_TYPE&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">类型信息</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tagGameType数组&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SUB_GP_LIST_KIND&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">种类消息</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tagGameKind数组<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SUB_GP_LIST_PROCESS&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">进程信息</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tagGameProcess数组<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SUB_GP_LIST_STATION&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">站点消息</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tagGameStation数组<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SUB_GP_LIST_SERVER&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">服务器房间</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tagGameServer数组<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SUB_GP_LIST_FINISH&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">列表发送完成</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SUB_GP_LIST_CONFIG&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">列表配置</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CMD_GP_ListConfig<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MDM_GP_SYSTEM&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">系统消息</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SUB_GP_VERSION&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">版本信息</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CMD_GP_Version<br />CRoomViewItem<br />&nbsp;&nbsp;&nbsp;&nbsp;OnSocketRead&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MDM_GR_LOGON&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">登录消息</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SUB_GR_LOGON_SUCCESS&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">登录成功</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SUB_GR_LOGON_ERROR&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">登录失败</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SUB_GR_LOGON_FINISH&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">登录完成</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MDM_GR_USER&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">用户消息</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SUB_GR_USER_COME&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">用户进入</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tagUserInfoHead<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;（附加）<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DTP_USER_ACCOUNTS&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">用户帐户</span><span style="color: #008000"><br /></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;数据由DataDescribe描述<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DTP_USER_GROUP_NAME&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">社团名字</span><span style="color: #008000"><br /></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;数据由DataDescribe描述<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SUB_GR_USER_STATUS&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">用户状态</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CMD_GR_UserStatus<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SUB_GR_USER_SCORE&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">用户分数</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CMD_GR_UserScore<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SUB_GR_SIT_FAILED&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">坐下失败</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CMD_GR_SitFailed<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SUB_GR_USER_CHAT&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">用户聊天</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CMD_GR_UserChat<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SUB_GR_USER_WISPER&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">用户私语</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CMD_GR_Wisper<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SUB_GR_USER_INVITE&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">邀请玩家</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CMD_GR_UserInvite<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MDM_GR_INFO&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">配置信息</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SUB_GR_SERVER_INFO&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">房间信息</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CMD_GR_ServerInfo<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SUB_GR_COLUMN_INFO&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">列表解释</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CMD_GR_ColumnInfo<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SUB_GR_CONFIG_FINISH&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">配置完成</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MDM_GR_STATUS&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">状态信息</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SUB_GR_TABLE_INFO&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">桌子信息&nbsp;</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CMD_GR_TableInfo<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SUB_GR_TABLE_STATUS&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">桌子状态</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CMD_GR_TableStatus<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MDM_GR_SYSTEM&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">系统消息</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SUB_GR_MESSAGE&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">系统消息</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CMD_GR_Message<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MDM_GR_SERVER_INFO&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">房间信息</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SUB_GR_ONLINE_COUNT_INFO&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">在线信息</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tagOnLineCountInfo<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MDM_GF_GAME&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">游戏消息</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MDM_GF_FRAME&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">框架消息</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IPC_SocketPackage<br /><br /></span></div><img src ="http://www.cppblog.com/Error/aggbug/150109.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Error/" target="_blank">Enic</a> 2011-07-04 13:48 <a href="http://www.cppblog.com/Error/articles/150109.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>工具类：收发包辅助类  CSendPacketHelpr  CRecvPacketHelpr</title><link>http://www.cppblog.com/Error/articles/150092.html</link><dc:creator>Enic</dc:creator><author>Enic</author><pubDate>Mon, 04 Jul 2011 02:50:00 GMT</pubDate><guid>http://www.cppblog.com/Error/articles/150092.html</guid><wfw:comment>http://www.cppblog.com/Error/comments/150092.html</wfw:comment><comments>http://www.cppblog.com/Error/articles/150092.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Error/comments/commentRss/150092.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Error/services/trackbacks/150092.html</trackback:ping><description><![CDATA[<span style="color: #008000">应为协议都是遵循：len type&nbsp;data这样的结构，所以打包发送和接收解包可以有通用的做法，，，<br />&nbsp; 
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #808080">////////////////////////////////////////////////////////////////////////</span><span style="color: #008000">//</span><span style="color: #808080"><br /></span><span style="color: #000000"><br /></span><span style="color: #008000">//</span><span style="color: #008000">数据描述头</span><span style="color: #008000"><br /></span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;tagDataDescribe<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;WORD&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;wDataSize;&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: #000000">&nbsp;&nbsp;&nbsp;&nbsp;WORD&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;wDataDescribe;&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: #000000">};<br /><br /></span><span style="color: #808080">////////////////////////////////////////////////////////////////////////</span><span style="color: #008000">//</span></div></span><br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008000">//</span><span style="color: #008000">数据包辅助类（多包组合成一包）</span><span style="color: #008000"><br /></span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;CSendPacketHelper<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">变量定义</span><span style="color: #008000"><br /></span><span style="color: #0000ff">protected</span><span style="color: #000000">:<br />&nbsp;&nbsp;&nbsp;&nbsp;WORD&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;m_wDataSize;&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: #000000">&nbsp;&nbsp;&nbsp;&nbsp;WORD&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;m_wBufferSize;&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: #000000">&nbsp;&nbsp;&nbsp;&nbsp;BYTE&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;</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;m_pcbBuffer;&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">缓冲指针<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">函数定义</span><span style="color: #008000"><br /></span><span style="color: #0000ff">public</span><span style="color: #000000">:<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">构造函数</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;CSendPacketHelper(</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;pcbBuffer,&nbsp;WORD&nbsp;wBufferSize)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_wDataSize</span><span style="color: #000000">=</span><span style="color: #000000">0</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_wBufferSize</span><span style="color: #000000">=</span><span style="color: #000000">wBufferSize;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_pcbBuffer</span><span style="color: #000000">=</span><span style="color: #000000">(BYTE&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">)pcbBuffer;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">析构函数</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">virtual</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">~</span><span style="color: #000000">CSendPacketHelper()&nbsp;{}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">功能函数</span><span style="color: #008000"><br /></span><span style="color: #0000ff">public</span><span style="color: #000000">:<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">清理数据</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;CleanData()&nbsp;{&nbsp;m_wDataSize</span><span style="color: #000000">=</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">获取大小</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;WORD&nbsp;GetDataSize()&nbsp;{&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;m_wDataSize;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">获取缓冲</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;GetDataBuffer()&nbsp;{&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;m_pcbBuffer;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">插入数据（如果缓冲区长度不够返回false）<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;wDataSize,&nbsp;wDataType&nbsp;实际上就是DataDescribe</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;AddPacket(</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;pData,&nbsp;WORD&nbsp;wDataSize,&nbsp;WORD&nbsp;wDataType)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&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: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ASSERT((wDataSize</span><span style="color: #000000">+</span><span style="color: #0000ff">sizeof</span><span style="color: #000000">(tagDataDescribe)</span><span style="color: #000000">+</span><span style="color: #000000">m_wDataSize)</span><span style="color: #000000">&lt;=</span><span style="color: #000000">m_wBufferSize);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;((wDataSize</span><span style="color: #000000">+</span><span style="color: #0000ff">sizeof</span><span style="color: #000000">(tagDataDescribe)</span><span style="color: #000000">+</span><span style="color: #000000">m_wDataSize)</span><span style="color: #000000">&gt;</span><span style="color: #000000">m_wBufferSize)&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">false</span><span style="color: #000000">;<br /><br />&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: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ASSERT(m_pcbBuffer</span><span style="color: #000000">!=</span><span style="color: #000000">NULL);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tagDataDescribe&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;pDataDescribe</span><span style="color: #000000">=</span><span style="color: #000000">(tagDataDescribe&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">)(m_pcbBuffer</span><span style="color: #000000">+</span><span style="color: #000000">m_wDataSize);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pDataDescribe</span><span style="color: #000000">-&gt;</span><span style="color: #000000">wDataSize</span><span style="color: #000000">=</span><span style="color: #000000">wDataSize;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pDataDescribe</span><span style="color: #000000">-&gt;</span><span style="color: #000000">wDataDescribe</span><span style="color: #000000">=</span><span style="color: #000000">wDataType;<br /><br />&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: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(wDataSize</span><span style="color: #000000">&gt;</span><span style="color: #000000">0</span><span style="color: #000000">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ASSERT(pData</span><span style="color: #000000">!=</span><span style="color: #000000">NULL);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CopyMemory(pDataDescribe</span><span style="color: #000000">+</span><span style="color: #000000">1</span><span style="color: #000000">,pData,wDataSize);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&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: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_wDataSize</span><span style="color: #000000">+=</span><span style="color: #0000ff">sizeof</span><span style="color: #000000">(tagDataDescribe)</span><span style="color: #000000">+</span><span style="color: #000000">wDataSize;<br />&nbsp;&nbsp;&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: #0000ff">true</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />};<br /><br /></span><span style="color: #808080">///////////////////////////////////////////////////////////////////////////////////////</span><span style="color: #008000">//</span><span style="color: #808080"><br /></span><span style="color: #000000"><br /></span><span style="color: #008000">//</span><span style="color: #008000">数据包辅助类</span><span style="color: #008000"><br /></span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;CRecvPacketHelper<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">变量定义</span><span style="color: #008000"><br /></span><span style="color: #0000ff">protected</span><span style="color: #000000">:<br />&nbsp;&nbsp;&nbsp;&nbsp;WORD&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;m_wDataPos;&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: #000000">&nbsp;&nbsp;&nbsp;&nbsp;WORD&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;m_wDataSize;&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: #000000">&nbsp;&nbsp;&nbsp;&nbsp;BYTE&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;</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;m_pcbBuffer;&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">缓冲指针<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">函数定义</span><span style="color: #008000"><br /></span><span style="color: #0000ff">public</span><span style="color: #000000">:<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">构造函数</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;CRecvPacketHelper(LPCVOID&nbsp;pcbBuffer,&nbsp;WORD&nbsp;wDataSize)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_wDataPos</span><span style="color: #000000">=</span><span style="color: #000000">0</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_wDataSize</span><span style="color: #000000">=</span><span style="color: #000000">wDataSize;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_pcbBuffer</span><span style="color: #000000">=</span><span style="color: #000000">(BYTE&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">)pcbBuffer;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">析构函数</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">virtual</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">~</span><span style="color: #000000">CRecvPacketHelper()&nbsp;{}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">功能函数</span><span style="color: #008000"><br /></span><span style="color: #0000ff">public</span><span style="color: #000000">:<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">获取数据（返回一包数据）<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;@DataDescribe：数据描述（len&nbsp;type）<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;@return:&nbsp;数据</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;GetData(tagDataDescribe&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">&nbsp;DataDescribe)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&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: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(m_wDataPos</span><span style="color: #000000">&gt;=</span><span style="color: #000000">m_wDataSize)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ASSERT(m_wDataPos</span><span style="color: #000000">==</span><span style="color: #000000">m_wDataSize);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DataDescribe.wDataSize</span><span style="color: #000000">=</span><span style="color: #000000">0</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DataDescribe.wDataDescribe</span><span style="color: #000000">=</span><span style="color: #000000">DTP_NULL;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;NULL;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&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: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ASSERT((m_wDataPos</span><span style="color: #000000">+</span><span style="color: #0000ff">sizeof</span><span style="color: #000000">(tagDataDescribe))</span><span style="color: #000000">&lt;=</span><span style="color: #000000">m_wDataSize);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CopyMemory(</span><span style="color: #000000">&amp;</span><span style="color: #000000">DataDescribe,m_pcbBuffer</span><span style="color: #000000">+</span><span style="color: #000000">m_wDataPos,</span><span style="color: #0000ff">sizeof</span><span style="color: #000000">(tagDataDescribe));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ASSERT((m_wDataPos</span><span style="color: #000000">+</span><span style="color: #0000ff">sizeof</span><span style="color: #000000">(tagDataDescribe)</span><span style="color: #000000">+</span><span style="color: #000000">DataDescribe.wDataSize)</span><span style="color: #000000">&lt;=</span><span style="color: #000000">m_wDataSize);<br /><br />&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: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;((m_wDataPos</span><span style="color: #000000">+</span><span style="color: #0000ff">sizeof</span><span style="color: #000000">(tagDataDescribe)</span><span style="color: #000000">+</span><span style="color: #000000">DataDescribe.wDataSize)</span><span style="color: #000000">&gt;</span><span style="color: #000000">m_wDataSize)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DataDescribe.wDataSize</span><span style="color: #000000">=</span><span style="color: #000000">0</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DataDescribe.wDataDescribe</span><span style="color: #000000">=</span><span style="color: #000000">DTP_NULL;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;NULL;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&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: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;pData</span><span style="color: #000000">=</span><span style="color: #000000">NULL;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(DataDescribe.wDataSize</span><span style="color: #000000">&gt;</span><span style="color: #000000">0</span><span style="color: #000000">)&nbsp;pData</span><span style="color: #000000">=</span><span style="color: #000000">m_pcbBuffer</span><span style="color: #000000">+</span><span style="color: #000000">m_wDataPos</span><span style="color: #000000">+</span><span style="color: #0000ff">sizeof</span><span style="color: #000000">(tagDataDescribe);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_wDataPos</span><span style="color: #000000">+=</span><span style="color: #0000ff">sizeof</span><span style="color: #000000">(tagDataDescribe)</span><span style="color: #000000">+</span><span style="color: #000000">DataDescribe.wDataSize;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;pData;<br />&nbsp;&nbsp;&nbsp;&nbsp;};<br />};</span></div><img src ="http://www.cppblog.com/Error/aggbug/150092.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Error/" target="_blank">Enic</a> 2011-07-04 10:50 <a href="http://www.cppblog.com/Error/articles/150092.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>成也萧何败也肖何？ IUnknowEx</title><link>http://www.cppblog.com/Error/articles/148413.html</link><dc:creator>Enic</dc:creator><author>Enic</author><pubDate>Fri, 10 Jun 2011 04:30:00 GMT</pubDate><guid>http://www.cppblog.com/Error/articles/148413.html</guid><wfw:comment>http://www.cppblog.com/Error/comments/148413.html</wfw:comment><comments>http://www.cppblog.com/Error/articles/148413.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Error/comments/commentRss/148413.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Error/services/trackbacks/148413.html</trackback:ping><description><![CDATA[相关UML:<br /><img height="296" alt="" src="http://www.cppblog.com/images/cppblog_com/error/IUnknownEx.jpg" width="636" border="0" longdesc="" /><br /><br />看下某个查询接口的代码：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #808080">////////////////////////////////////////////////////////////////////////</span><span style="color: #008000">//</span><span style="color: #808080"><br /></span><span style="color: #000000"><br /></span><span style="color: #008000">//</span><span style="color: #008000">接口查询宏</span><span style="color: #008000"><br /></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;QUERYINTERFACE(Interface,Guid,dwQueryVer)&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;&nbsp;&nbsp;&nbsp;&nbsp;\</span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;((Guid</span><span style="color: #000000">==</span><span style="color: #000000">IID_##Interface)</span><span style="color: #000000">&amp;&amp;</span><span style="color: #000000">(InterfaceVersionCheck(dwQueryVer,VER_##Interface)))&nbsp;&nbsp;&nbsp;&nbsp;\<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;static_cast</span><span style="color: #000000">&lt;</span><span style="color: #000000">Interface&nbsp;</span><span style="color: #000000">*&gt;</span><span style="color: #000000">(</span><span style="color: #0000ff">this</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br /></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;QUERYINTERFACE_IUNKNOWNEX(BaseInterface,Guid,dwQueryVer)&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: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;((Guid</span><span style="color: #000000">==</span><span style="color: #000000">IID_IUnknownEx)</span><span style="color: #000000">&amp;&amp;</span><span style="color: #000000">(InterfaceVersionCheck(dwQueryVer,VER_IUnknownEx)))&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;static_cast</span><span style="color: #000000">&lt;</span><span style="color: #000000">IUnknownEx&nbsp;</span><span style="color: #000000">*&gt;</span><span style="color: #000000">(static_cast</span><span style="color: #000000">&lt;</span><span style="color: #000000">BaseInterface&nbsp;</span><span style="color: #000000">*&gt;</span><span style="color: #000000">(</span><span style="color: #0000ff">this</span><span style="color: #000000">));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br /></span><span style="color: #008000">//</span><span style="color: #008000">获取接口宏</span><span style="color: #008000"><br /></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;GET_MYSELF_INTERFACE(Interface)&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\</span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;((Interface&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">)QueryInterface(IID_##Interface,VER_##Interface))<br /><br /></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;GET_OBJECT_INTERFACE(Object,Interface)&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\</span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;((Interface&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">)Object.QueryInterface(IID_##Interface,VER_##Interface))<br /><br /></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;GET_OBJECTPTR_INTERFACE(pObject,Interface)&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;&nbsp;&nbsp;&nbsp;&nbsp;\</span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;((pObject</span><span style="color: #000000">==</span><span style="color: #000000">NULL)</span><span style="color: #000000">?</span><span style="color: #000000">NULL:((Interface&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">)pObject</span><span style="color: #000000">-&gt;</span><span style="color: #000000">QueryInterface(IID_##Interface,VER_##Interface)))<br /><br /></span><span style="color: #808080">////////////////////////////////////////////////////////////////////////</span><span style="color: #008000">//</span><span style="color: #808080"><br /></span><span style="color: #000000"><br /><br /></span><span style="color: #008000">//</span><span style="color: #008000">接口查询</span><span style="color: #008000"><br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;__cdecl&nbsp;CEventService::QueryInterface(</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;IID&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">&nbsp;Guid,&nbsp;DWORD&nbsp;dwQueryVer)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;QUERYINTERFACE(IEventService,Guid,dwQueryVer);<br />&nbsp;&nbsp;&nbsp;&nbsp;QUERYINTERFACE_IUNKNOWNEX(IEventService,Guid,dwQueryVer);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;NULL;<br />}</span></div><br /><br />由于这个函数的存在，是的接口传递的类型检查由编译期转到了运行期。<br />任意接口的传递都只需要传递一个IUnknowEx指针，然后接受方使用IUnknowEx去判断是否是自己需要的接口。<br />这个机制是好是坏，难说，，，<img src ="http://www.cppblog.com/Error/aggbug/148413.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Error/" target="_blank">Enic</a> 2011-06-10 12:30 <a href="http://www.cppblog.com/Error/articles/148413.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>服务引擎概览</title><link>http://www.cppblog.com/Error/articles/148411.html</link><dc:creator>Enic</dc:creator><author>Enic</author><pubDate>Fri, 10 Jun 2011 03:57:00 GMT</pubDate><guid>http://www.cppblog.com/Error/articles/148411.html</guid><wfw:comment>http://www.cppblog.com/Error/comments/148411.html</wfw:comment><comments>http://www.cppblog.com/Error/articles/148411.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/Error/comments/commentRss/148411.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Error/services/trackbacks/148411.html</trackback:ping><description><![CDATA[相关UML：<br /><img height="398" alt="" src="http://www.cppblog.com/images/cppblog_com/error/CServiceEngine.jpg" width="812" border="0" longdesc="" /><br /><br />服务引擎这是简单的聚合了其他的子模块，然后在Start中做些初始化的工作。<img src ="http://www.cppblog.com/Error/aggbug/148411.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Error/" target="_blank">Enic</a> 2011-06-10 11:57 <a href="http://www.cppblog.com/Error/articles/148411.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>异步引擎</title><link>http://www.cppblog.com/Error/articles/148355.html</link><dc:creator>Enic</dc:creator><author>Enic</author><pubDate>Thu, 09 Jun 2011 08:40:00 GMT</pubDate><guid>http://www.cppblog.com/Error/articles/148355.html</guid><wfw:comment>http://www.cppblog.com/Error/comments/148355.html</wfw:comment><comments>http://www.cppblog.com/Error/articles/148355.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Error/comments/commentRss/148355.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Error/services/trackbacks/148355.html</trackback:ping><description><![CDATA[相关UML：<br /><img height="307" alt="" src="http://www.cppblog.com/images/cppblog_com/error/AsynchronismEngine.jpg" width="721" border="0" longdesc="" /><br /><br />核心技术在于：在指定的线程中创建窗口，然后向窗口发送消息，在窗口消息处理中调用外部回调。<img src ="http://www.cppblog.com/Error/aggbug/148355.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Error/" target="_blank">Enic</a> 2011-06-09 16:40 <a href="http://www.cppblog.com/Error/articles/148355.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CEventService</title><link>http://www.cppblog.com/Error/articles/148305.html</link><dc:creator>Enic</dc:creator><author>Enic</author><pubDate>Wed, 08 Jun 2011 16:13:00 GMT</pubDate><guid>http://www.cppblog.com/Error/articles/148305.html</guid><wfw:comment>http://www.cppblog.com/Error/comments/148305.html</wfw:comment><comments>http://www.cppblog.com/Error/articles/148305.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Error/comments/commentRss/148305.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Error/services/trackbacks/148305.html</trackback:ping><description><![CDATA[<div>相关UML：<br /><img border="0" alt="" src="http://www.cppblog.com/images/cppblog_com/error/EventService.jpg" width="494" longdesc="" height="312" /><br /><br />线程安全的做一些格式化，然后一股脑输出到窗口句柄上，，，<br /></div><img src ="http://www.cppblog.com/Error/aggbug/148305.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Error/" target="_blank">Enic</a> 2011-06-09 00:13 <a href="http://www.cppblog.com/Error/articles/148305.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DataBaseEngine</title><link>http://www.cppblog.com/Error/articles/148282.html</link><dc:creator>Enic</dc:creator><author>Enic</author><pubDate>Wed, 08 Jun 2011 10:16:00 GMT</pubDate><guid>http://www.cppblog.com/Error/articles/148282.html</guid><wfw:comment>http://www.cppblog.com/Error/comments/148282.html</wfw:comment><comments>http://www.cppblog.com/Error/articles/148282.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Error/comments/commentRss/148282.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Error/services/trackbacks/148282.html</trackback:ping><description><![CDATA[相关UML：<br /><img height="518" alt="" src="http://www.cppblog.com/images/cppblog_com/error/DatabaseEngine.jpg" width="812" border="0" longdesc="" /><br /><br />使用数据库引擎必须持有数据库引擎内部队列，实现数据库回调接口（用来处理数据库操作请求），然后结果投递到调度引擎队列。<br /><br />理解网络狐棋牌，最重要是理解两个概念：<br />1，队列服务<br />2，接口的传递<br /><br />晚上分析IEventService，明天应该能把IServiceEngine搞定 -_+! <img src ="http://www.cppblog.com/Error/aggbug/148282.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Error/" target="_blank">Enic</a> 2011-06-08 18:16 <a href="http://www.cppblog.com/Error/articles/148282.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>TCPSocketEnging分析</title><link>http://www.cppblog.com/Error/articles/148237.html</link><dc:creator>Enic</dc:creator><author>Enic</author><pubDate>Tue, 07 Jun 2011 15:28:00 GMT</pubDate><guid>http://www.cppblog.com/Error/articles/148237.html</guid><wfw:comment>http://www.cppblog.com/Error/comments/148237.html</wfw:comment><comments>http://www.cppblog.com/Error/articles/148237.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Error/comments/commentRss/148237.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Error/services/trackbacks/148237.html</trackback:ping><description><![CDATA[相关UML：<br />网络引擎整体结构：<br /><img border="0" alt="" src="http://www.cppblog.com/images/cppblog_com/error/TCPEngine.jpg" width="879" longdesc="" height="402" /><br /><br />SocketItem细节：<br /><img border="0" alt="" src="http://www.cppblog.com/images/cppblog_com/error/SocketItem.jpg" width="779" longdesc="" height="298" /><br /><br /><br />先来看几个底层结构：<br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008000">//</span><span style="color: #008000">重叠结构类</span><span style="color: #008000"><br /></span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;COverLapped<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">变量定义</span><span style="color: #008000"><br /></span><span style="color: #0000ff">public</span><span style="color: #000000">:<br />&nbsp;&nbsp;&nbsp;&nbsp;WSABUF&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;m_WSABuffer;&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: #000000">&nbsp;&nbsp;&nbsp;&nbsp;OVERLAPPED&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_OverLapped;&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: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;enOperationType&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_OperationType;&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">操作类型<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">函数定义</span><span style="color: #008000"><br /></span><span style="color: #0000ff">public</span><span style="color: #000000">:<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">构造函数</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;COverLapped(enOperationType&nbsp;OperationType);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">析构函数</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">virtual</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">~</span><span style="color: #000000">COverLapped();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">信息函数</span><span style="color: #008000"><br /></span><span style="color: #0000ff">public</span><span style="color: #000000">:<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">获取类型</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;enOperationType&nbsp;GetOperationType()&nbsp;{&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;m_OperationType;&nbsp;}<br />};<br /><br /></span><span style="color: #008000">//</span><span style="color: #008000">接收重叠结构</span><span style="color: #008000"><br /></span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;COverLappedSend&nbsp;:&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;COverLapped<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">数据变量</span><span style="color: #008000"><br /></span><span style="color: #0000ff">public</span><span style="color: #000000">:<br />&nbsp;&nbsp;&nbsp;&nbsp;BYTE&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;m_cbBuffer[SOCKET_BUFFER];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">数据缓冲<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">函数定义</span><span style="color: #008000"><br /></span><span style="color: #0000ff">public</span><span style="color: #000000">:<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">构造函数</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;COverLappedSend();<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">析构函数</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">virtual</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">~</span><span style="color: #000000">COverLappedSend();<br />};<br /><br /></span><span style="color: #008000">//</span><span style="color: #008000">重叠结构模板</span><span style="color: #008000"><br /></span><span style="color: #000000">template&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">enOperationType&nbsp;OperationType</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;CATLOverLapped&nbsp;:&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;COverLapped<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">函数定义</span><span style="color: #008000"><br /></span><span style="color: #0000ff">public</span><span style="color: #000000">:<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">构造函数</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;CATLOverLapped()&nbsp;:&nbsp;COverLapped(OperationType)&nbsp;{}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">析构函数</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">virtual</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">~</span><span style="color: #000000">CATLOverLapped()&nbsp;{}<br />};</span></div><br /><br />先复习下基础，Windows下的网络模型有很多种，这里只拿出三种来说：<br />EventSelect：基于信号机制，以socket为单位绑定信号量，当socket上有指定的事件发生时激发信号，然后查询事件处理事件重设事件，继续在信号量上等待。其实也是在伯克利select模型上的换不换药的加强。<br />OverLapped：分两种工作模式完成回调，和完成事件。重叠IO监视每次操作，每次IO都绑定一个重叠对象，当操作完成以后激发信号或者调用回调。<br />IOCP：和overlapped类似，不过结果经过了Windows的预处理以队列的形式挂在完成端口上<br /><br />根据上面的复习，可以得出一个结论，IOCP环境中每一次IO操作都需要一个重叠结构，那么一个CServerSocketItem至少需要如些这些东东：<br />他要接受数据，所以必须有一个接受数据的 OverLapped<br />它要发送数据，说以必须有一个发送数据的 OverLapped<br />netFox对OverLapped做了使用了类似池的的管理手段，他的Send都是不等待上一次完成就直接投递下一个请求了，，，这是很操蛋的做法，，，<br /><br />然后继续复习下基础：<br />在EventSelect模型中获处理件类型流程是这样：<br />event受信，使用::WSAEnumNetworkEvents查询和这个event关联的socket发生的事件，根据查询到的事件类型去处理事件<br />在以每一次IO为查询对象重叠IO、IOCP模型中是这样：<br />使用GetOverlappedResult 或者 GetQueuedCompletionStatus然后根据重叠结构去查询投递的是什么类型的操作，然后找到关联的socket去操作，，，<br /><br />这样必然要给OverLapped做个扩展，提供一种通过OverLapped查询操作类型和socket的能力。<br />通过分析代码，netFox关联socket是通过在创建完成端口的时候绑定SocketItem对象指针完成的，操作类型是通过对OverLapped结构加强完成的。<br />通过GetQueuedCompletionStatus获取到完成OverLapped以后使用一个宏：<br />（这是COverLapped类型）&nbsp; pSocketLapped=CONTAINING_RECORD(pOverLapped,COverLapped,m_OverLapped);<br />来获取包装后的OverLapped，然后获取操作类型，然后执行具体操作。<br />其实宏的展开如下：<br />（COverLapped*）((BYTE*)pOverLapped - (COverLapped*)(0)-&gt;m_OverLapped);<br />pOverLapped是获取到的某个COverLapped中的成员变量，(COverLapped*)(0)-&gt;m_OverLapped是到在COverLapped中的偏移，((BYTE*)pOverLapped - (COverLapped*)(0)-&gt;m_OverLapped) 就是根据pOverLapped推算出来的包含地址为pOverLapped作为成员变量m_OverLapped的COverLapped对象的地址。<br />然后就分别调用：<br /><br />//发送完成函数<br />bool CServerSocketItem::OnSendCompleted(COverLappedSend * pOverLappedSend, DWORD dwThancferred);<br /><br />//接收完成函数<br />bool CServerSocketItem::OnRecvCompleted(COverLappedRecv * pOverLappedRecv, DWORD dwThancferred);<br /><br />为毛要区分Send OverLapped 和 Recv OverLapped呢，，，<br />应为投递一次Send不一定是瞬间完成的，在处理的过程中存储数据的内存应该是锁定的，也就是不允许修改的，，，所以OverLapped应该自己管理内存。<br />而recv应该也是需要有一片内存直接接受数据的，很奇怪netFox没有提供，，，<br /><br />recv居然是在投递接受请求的时候给了一个空的buffer，然后在完成回调中自己再次调用recv方法接受数据。<br />接受有关的成员变量如下：<br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">状态变量</span><span style="color: #008000"><br /></span><span style="color: #0000ff">protected</span><span style="color: #000000">:<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">bool</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;m_bNotify;&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: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">bool</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;m_bRecvIng;&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: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">bool</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;m_bCloseIng;&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: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">bool</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;m_bAllowBatch;&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: #000000">&nbsp;&nbsp;&nbsp;&nbsp;WORD&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;m_wRecvSize;&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: #000000">&nbsp;&nbsp;&nbsp;&nbsp;BYTE&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;m_cbRecvBuf[SOCKET_BUFFER</span><span style="color: #000000">*</span><span style="color: #000000">5</span><span style="color: #000000">];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">接收缓冲</span></div>int iRetCode=recv(m_hSocket,(char *)m_cbRecvBuf+m_wRecvSize,sizeof(m_cbRecvBuf)-m_wRecvSize,0);<br />难道这么蠢的做法只是为了躲开分包算法？<br />具体的看看接受代码：<br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008000">//</span><span style="color: #008000">接收完成函数</span><span style="color: #008000"><br /></span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;CServerSocketItem::OnRecvCompleted(COverLappedRecv&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;pOverLappedRecv,&nbsp;DWORD&nbsp;dwThancferred)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">效验数据</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;ASSERT(m_bRecvIng</span><span style="color: #000000">==</span><span style="color: #0000ff">true</span><span style="color: #000000">);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">设置变量</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;m_bRecvIng</span><span style="color: #000000">=</span><span style="color: #0000ff">false</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;m_dwRecvTickCount</span><span style="color: #000000">=</span><span style="color: #000000">GetTickCount();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">判断关闭</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(m_hSocket</span><span style="color: #000000">==</span><span style="color: #000000">INVALID_SOCKET)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CloseSocket(m_wRountID);<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: #0000ff">true</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">接收数据</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;iRetCode</span><span style="color: #000000">=</span><span style="color: #000000">recv(m_hSocket,(</span><span style="color: #0000ff">char</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">)m_cbRecvBuf</span><span style="color: #000000">+</span><span style="color: #000000">m_wRecvSize,</span><span style="color: #0000ff">sizeof</span><span style="color: #000000">(m_cbRecvBuf)</span><span style="color: #000000">-</span><span style="color: #000000">m_wRecvSize,</span><span style="color: #000000">0</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(iRetCode</span><span style="color: #000000">&lt;=</span><span style="color: #000000">0</span><span style="color: #000000">)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CloseSocket(m_wRountID);<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: #0000ff">true</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">接收完成</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;m_wRecvSize</span><span style="color: #000000">+=</span><span style="color: #000000">iRetCode;<br />&nbsp;&nbsp;&nbsp;&nbsp;BYTE&nbsp;cbBuffer[SOCKET_BUFFER];<br />&nbsp;&nbsp;&nbsp;&nbsp;CMD_Head&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;pHead</span><span style="color: #000000">=</span><span style="color: #000000">(CMD_Head&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">)m_cbRecvBuf;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">处理数据</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;(m_wRecvSize</span><span style="color: #000000">&gt;=</span><span style="color: #0000ff">sizeof</span><span style="color: #000000">(CMD_Head))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&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: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WORD&nbsp;wPacketSize</span><span style="color: #000000">=</span><span style="color: #000000">pHead</span><span style="color: #000000">-&gt;</span><span style="color: #000000">CmdInfo.wDataSize;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(wPacketSize</span><span style="color: #000000">&gt;</span><span style="color: #000000">SOCKET_BUFFER)&nbsp;</span><span style="color: #0000ff">throw</span><span style="color: #000000">&nbsp;TEXT(</span><span style="color: #000000">"</span><span style="color: #000000">数据包超长</span><span style="color: #000000">"</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(wPacketSize</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">sizeof</span><span style="color: #000000">(CMD_Head))&nbsp;</span><span style="color: #0000ff">throw</span><span style="color: #000000">&nbsp;TEXT(</span><span style="color: #000000">"</span><span style="color: #000000">数据包非法</span><span style="color: #000000">"</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(pHead</span><span style="color: #000000">-&gt;</span><span style="color: #000000">CmdInfo.cbMessageVer</span><span style="color: #000000">!=</span><span style="color: #000000">SOCKET_VER)&nbsp;</span><span style="color: #0000ff">throw</span><span style="color: #000000">&nbsp;TEXT(</span><span style="color: #000000">"</span><span style="color: #000000">数据包版本错误</span><span style="color: #000000">"</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(m_wRecvSize</span><span style="color: #000000">&lt;</span><span style="color: #000000">wPacketSize)&nbsp;</span><span style="color: #0000ff">break</span><span style="color: #000000">;<br /><br />&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: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CopyMemory(cbBuffer,m_cbRecvBuf,wPacketSize);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WORD&nbsp;wRealySize</span><span style="color: #000000">=</span><span style="color: #000000">CrevasseBuffer(cbBuffer,wPacketSize);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ASSERT(wRealySize</span><span style="color: #000000">&gt;=</span><span style="color: #0000ff">sizeof</span><span style="color: #000000">(CMD_Head));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_dwRecvPacketCount</span><span style="color: #000000">++</span><span style="color: #000000">;<br /><br />&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: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WORD&nbsp;wDataSize</span><span style="color: #000000">=</span><span style="color: #000000">wRealySize</span><span style="color: #000000">-</span><span style="color: #0000ff">sizeof</span><span style="color: #000000">(CMD_Head);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;pDataBuffer</span><span style="color: #000000">=</span><span style="color: #000000">cbBuffer</span><span style="color: #000000">+</span><span style="color: #0000ff">sizeof</span><span style="color: #000000">(CMD_Head);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CMD_Command&nbsp;Command</span><span style="color: #000000">=</span><span style="color: #000000">((CMD_Head&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">)cbBuffer)</span><span style="color: #000000">-&gt;</span><span style="color: #000000">CommandInfo;<br /><br />&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: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(Command.wMainCmdID</span><span style="color: #000000">==</span><span style="color: #000000">MDM_KN_COMMAND)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">switch</span><span style="color: #000000">&nbsp;(Command.wSubCmdID)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">case</span><span style="color: #000000">&nbsp;SUB_KN_DETECT_SOCKET:&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">网络检测</span><span style="color: #008000"><br /></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;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">break</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">default</span><span style="color: #000000">:&nbsp;</span><span style="color: #0000ff">throw</span><span style="color: #000000">&nbsp;TEXT(</span><span style="color: #000000">"</span><span style="color: #000000">非法命令码</span><span style="color: #000000">"</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&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: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_pIServerSocketItemSink</span><span style="color: #000000">-&gt;</span><span style="color: #000000">OnSocketReadEvent(Command,pDataBuffer,wDataSize,</span><span style="color: #0000ff">this</span><span style="color: #000000">);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&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: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_wRecvSize</span><span style="color: #000000">-=</span><span style="color: #000000">wPacketSize;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MoveMemory(m_cbRecvBuf,m_cbRecvBuf</span><span style="color: #000000">+</span><span style="color: #000000">wPacketSize,m_wRecvSize);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">catch</span><span style="color: #000000">&nbsp;(<img alt="" src="http://www.cppblog.com/Images/dot.gif" />)<br />&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CloseSocket(m_wRountID);<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: #0000ff">false</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;RecvData();<br />}</span></div><br />这是还是有分包算法的，总的来说接受流程如下：<br />直接使用recv把数据接受到SocketItem的缓冲区中，当长度大于CMD_HEAD之后，进入处理阶段，处理head数据各种判断，然后将数据扔出去，再调整缓冲区，，，<br /><br />简单的说：<br />Send完全不考虑同步问题，不管一个劲的网队列投递Send请求，，，这边处理队列也是直接Send完事，完全不考虑上一次是否send成功，，，<br />Recv更是莫名其妙的使用完成端口绕一圈还回到recv直接接受了，，，<br /><br />很狗血的做法，，，<br /><br />更正下我自己狗血的不理解：<br />如果一个服务器提交了非常多的重叠的receive在每一个连接上，那么限制会随着连接数的增长而变化。如果一个服务器能够预先估计可能会产生的最大并发连接数，服务器可以投递一个使用零缓冲区的receive在每一个连接上。因为当你提交操作没有缓冲区时，那么也不会存在内存被锁定了。使用这种办法后，当你的receive操作事件完成返回时，该socket底层缓冲区的数据会原封不动的还在其中而没有被读取到receive操作的缓冲区来。此时，服务器可以简单的调用非阻塞式的recv将存在socket缓冲区中的数据全部读出来，一直到recv返回 WSAEWOULDBLOCK 为止。 这种设计非常适合那些可以牺牲数据吞吐量而换取巨大 并发连接数的服务器。当然，你也需要意识到如何让客户端的行为尽量避免对服务器造成影响。在上一个例子中，当一个零缓冲区的receive操作被返回后使 用一个非阻塞的recv去读取socket缓冲区中的数据，如果服务器此时可预计到将会有爆发的数据流，那么可以考虑此时投递一个或者多个receive 来取代非阻塞的recv来进行数据接收。（这比你使用1个缺省的8K缓冲区来接收要好的多。） 
<p>源码中提供了一个简单实用的解决WSAENOBUF错误的办法。我们执行了一个零字节缓冲的异步WSARead(...)(参见 OnZeroByteRead(..))。当这个请求完成，我们知道在TCP/IP栈中有数据，然后我们通过执行几个有MAXIMUMPACKAGESIZE缓冲的异步WSARead(...)去读，解决了WSAENOBUFS问题。但是这种解决方法降低了服务器的吞吐量。</p>
<p>总结： <br /><br />解决方法一： <br /><br />投递使用空缓冲区的 receive操作，当操作返回后，使用非阻塞的recv来进行真实数据的读取。因此在完成端口的每一个连接中需要使用一个循环的操作来不断的来提交空缓冲区的receive操作。 <br /><br />解决方法二： <br /><br />在投递几个普通含有缓冲区的receive操作后，进接着开始循环投递一个空缓冲区的receive操作。这样保证它们按照投递顺序依次返回，这样我们就总能对被锁定的内存进行解锁。 <br /><br /><br /><br /></p>///////////<br /><div>如果一个服务器同时连接了许多客户端, 对每个客户端又调用了许多 WSARecv, 那么大量的内存将会被锁定到非分页内存池.  锁定这些内存时是按照页面边界来锁定的, 也就是说即使你 WSARecv 的缓存大小是 1 字节, 被锁定的内存也将会是 4k. 非分页内存池是由整个系统共用的,  如果用完的话最坏的情况就是系统崩溃. 一个解决办法是, 使用大小为 0 的缓冲区调用 WSARecv. 等到调用成功时再换用非阻塞的 recv 接收到来的数据,  直到它返回 WSAEWOULDBLOCK 表明数据已经全部读完. 在这个过程中没有任何内存需要被锁定, 但坏处是效率稍低.</div><img src ="http://www.cppblog.com/Error/aggbug/148237.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Error/" target="_blank">Enic</a> 2011-06-07 23:28 <a href="http://www.cppblog.com/Error/articles/148237.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>TimerEngine</title><link>http://www.cppblog.com/Error/articles/148204.html</link><dc:creator>Enic</dc:creator><author>Enic</author><pubDate>Tue, 07 Jun 2011 07:13:00 GMT</pubDate><guid>http://www.cppblog.com/Error/articles/148204.html</guid><wfw:comment>http://www.cppblog.com/Error/comments/148204.html</wfw:comment><comments>http://www.cppblog.com/Error/articles/148204.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Error/comments/commentRss/148204.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Error/services/trackbacks/148204.html</trackback:ping><description><![CDATA[相关UML：<br /><img height="350" alt="" src="http://www.cppblog.com/images/cppblog_com/error/TimerEngine.jpg" width="671" border="0" longdesc="" /><br /><br />CTimerEngine成员变量：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">状态变量</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;DWORD&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;m_dwTimerSpace;&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: #0000ff">protected</span><span style="color: #000000">:<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">bool</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;m_bService;&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: #000000">&nbsp;&nbsp;&nbsp;&nbsp;DWORD&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;m_dwTimePass;&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: #000000">&nbsp;&nbsp;&nbsp;&nbsp;DWORD&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;m_dwTimeLeave;&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: #000000">&nbsp;&nbsp;&nbsp;&nbsp;CTimerItemPtr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_TimerItemFree;&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: #000000">&nbsp;&nbsp;&nbsp;&nbsp;CTimerItemPtr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_TimerItemActive;&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></div>这些是分析定时器线程函数需要了解的成员变量，其次是线程同步：<br />从代码中可以看出所有对：m_TimerItemActive;&nbsp; m_TimerItemFree;的操作都是在一个线程锁的保护之下的。<br /><br /><br />定时器线程：<br />通过CTimerThread绕一圈以后最终被循环执行的实际上是这个函数（m_dwTimerSpace控制最小时间）：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008000">//</span><span style="color: #008000">定时器通知</span><span style="color: #008000"><br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;CTimerEngine::OnTimerThreadSink()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">锁定资源</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;CThreadLockHandle&nbsp;LockHandle(</span><span style="color: #000000">&amp;</span><span style="color: #000000">m_ThreadLock);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">倒计时间</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(m_dwTimeLeave</span><span style="color: #000000">==</span><span style="color: #000000">NO_TIME_LEFT)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ASSERT(m_TimerItemActive.GetCount()</span><span style="color: #000000">==</span><span style="color: #000000">0</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">减少时间</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;ASSERT(m_dwTimeLeave</span><span style="color: #000000">&gt;=</span><span style="color: #000000">m_dwTimerSpace);<br />&nbsp;&nbsp;&nbsp;&nbsp;m_dwTimeLeave</span><span style="color: #000000">-=</span><span style="color: #000000">m_dwTimerSpace;<br />&nbsp;&nbsp;&nbsp;&nbsp;m_dwTimePass</span><span style="color: #000000">+=</span><span style="color: #000000">m_dwTimerSpace;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">查询定时器</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(m_dwTimeLeave</span><span style="color: #000000">==</span><span style="color: #000000">0</span><span style="color: #000000">)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;bKillTimer</span><span style="color: #000000">=</span><span style="color: #0000ff">false</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tagTimerItem&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;pTimerItem</span><span style="color: #000000">=</span><span style="color: #000000">NULL;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;dwTimeLeave</span><span style="color: #000000">=</span><span style="color: #000000">NO_TIME_LEFT;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(INT_PTR&nbsp;i</span><span style="color: #000000">=</span><span style="color: #000000">0</span><span style="color: #000000">;i</span><span style="color: #000000">&lt;</span><span style="color: #000000">m_TimerItemActive.GetCount();)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&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: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pTimerItem</span><span style="color: #000000">=</span><span style="color: #000000">m_TimerItemActive[i];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ASSERT(pTimerItem</span><span style="color: #000000">!=</span><span style="color: #000000">NULL);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ASSERT(pTimerItem</span><span style="color: #000000">-&gt;</span><span style="color: #000000">dwTimeLeave</span><span style="color: #000000">&gt;=</span><span style="color: #000000">m_dwTimePass);<br /><br />&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: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bKillTimer</span><span style="color: #000000">=</span><span style="color: #0000ff">false</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&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: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pTimerItem</span><span style="color: #000000">-&gt;</span><span style="color: #000000">dwTimeLeave&nbsp;</span><span style="color: #000000">-=</span><span style="color: #000000">&nbsp;m_dwTimePass;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(pTimerItem</span><span style="color: #000000">-&gt;</span><span style="color: #000000">dwTimeLeave</span><span style="color: #000000">==</span><span style="color: #000000">0L</span><span style="color: #000000">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&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: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_AttemperEvent.PostTimerEvent(pTimerItem</span><span style="color: #000000">-&gt;</span><span style="color: #000000">wTimerID,pTimerItem</span><span style="color: #000000">-&gt;</span><span style="color: #000000">wBindParam);<br /><br />&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: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(pTimerItem</span><span style="color: #000000">-&gt;</span><span style="color: #000000">dwRepeatTimes</span><span style="color: #000000">!=</span><span style="color: #000000">TIMER_REPEAT_TIMER)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ASSERT(pTimerItem</span><span style="color: #000000">-&gt;</span><span style="color: #000000">dwRepeatTimes</span><span style="color: #000000">&gt;</span><span style="color: #000000">0</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(pTimerItem</span><span style="color: #000000">-&gt;</span><span style="color: #000000">dwRepeatTimes</span><span style="color: #000000">==</span><span style="color: #000000">1L</span><span style="color: #000000">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bKillTimer</span><span style="color: #000000">=</span><span style="color: #0000ff">true</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_TimerItemActive.RemoveAt(i);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_TimerItemFree.Add(pTimerItem);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;pTimerItem</span><span style="color: #000000">-&gt;</span><span style="color: #000000">dwRepeatTimes</span><span style="color: #000000">--</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&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: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(bKillTimer</span><span style="color: #000000">==</span><span style="color: #0000ff">false</span><span style="color: #000000">)&nbsp;pTimerItem</span><span style="color: #000000">-&gt;</span><span style="color: #000000">dwTimeLeave</span><span style="color: #000000">=</span><span style="color: #000000">pTimerItem</span><span style="color: #000000">-&gt;</span><span style="color: #000000">dwElapse;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&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: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(bKillTimer</span><span style="color: #000000">==</span><span style="color: #0000ff">false</span><span style="color: #000000">)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i</span><span style="color: #000000">++</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dwTimeLeave</span><span style="color: #000000">=</span><span style="color: #000000">__min(dwTimeLeave,pTimerItem</span><span style="color: #000000">-&gt;</span><span style="color: #000000">dwTimeLeave);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ASSERT(dwTimeLeave</span><span style="color: #000000">%</span><span style="color: #000000">m_dwTimerSpace</span><span style="color: #000000">==</span><span style="color: #000000">0</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&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: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_dwTimePass</span><span style="color: #000000">=</span><span style="color: #000000">0L</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_dwTimeLeave</span><span style="color: #000000">=</span><span style="color: #000000">dwTimeLeave;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">;<br />}</span></div><br />CTimerEngine：<br />启动一个定时器线程，循环遍历定时器，如果发现满足出发条件的定时器就投递一个定时器消息到CQueueServiceEvent对象。<br /><br /><br /><br /><img src ="http://www.cppblog.com/Error/aggbug/148204.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Error/" target="_blank">Enic</a> 2011-06-07 15:13 <a href="http://www.cppblog.com/Error/articles/148204.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>调度引擎初步分析</title><link>http://www.cppblog.com/Error/articles/148169.html</link><dc:creator>Enic</dc:creator><author>Enic</author><pubDate>Tue, 07 Jun 2011 01:37:00 GMT</pubDate><guid>http://www.cppblog.com/Error/articles/148169.html</guid><wfw:comment>http://www.cppblog.com/Error/comments/148169.html</wfw:comment><comments>http://www.cppblog.com/Error/articles/148169.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Error/comments/commentRss/148169.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Error/services/trackbacks/148169.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 相关UML：CAttempterEngine实现了两个接口：IQueueServiceSink、IAttemperEngine;通过前面的分析，偶们了解到，IQueueServiceSink这个接口被是用来处理CQueueService中的数据的，根据上面的UML我们可以看到，CAttemperEngine关联了一个CQueueService（或者直接点说是：持有了一个CQueueService对...&nbsp;&nbsp;<a href='http://www.cppblog.com/Error/articles/148169.html'>阅读全文</a><img src ="http://www.cppblog.com/Error/aggbug/148169.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Error/" target="_blank">Enic</a> 2011-06-07 09:37 <a href="http://www.cppblog.com/Error/articles/148169.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CQueueServiceEvent初步分析</title><link>http://www.cppblog.com/Error/articles/147948.html</link><dc:creator>Enic</dc:creator><author>Enic</author><pubDate>Thu, 02 Jun 2011 06:36:00 GMT</pubDate><guid>http://www.cppblog.com/Error/articles/147948.html</guid><wfw:comment>http://www.cppblog.com/Error/comments/147948.html</wfw:comment><comments>http://www.cppblog.com/Error/articles/147948.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Error/comments/commentRss/147948.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Error/services/trackbacks/147948.html</trackback:ping><description><![CDATA[相关UML：<br /><img border="0" alt="" src="http://www.cppblog.com/images/cppblog_com/error/17010/o_QueueService.jpg" width="741" longdesc="" height="401" /><br /><br />代码分析：<br />首先CQueueServiceEvent这个名字很有诱惑，，，你感觉他是一个事件，其实不是。它实际的功能应该是一个带打包功能的事件队列，，，或者说是一个像指定的类似EventQueue的东东中投递事件。从接口上看，这个东东能投递TimerEvent&nbsp; DataBaseEvent&nbsp; SocketAcceptEvent&nbsp; SocketReadEvent&nbsp; SocketCloseEvent<br />应为它本身持有一个CQueueService指针，所以本身并不负责数据管理，只负责打包并添加到CQueueService实例中去。<br /><br />先看定时器事件： 
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080">&nbsp;1</span><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><span style="color: #000000">&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;2</span><span style="color: #008000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;PostTimerEvent(WORD&nbsp;wTimerID,&nbsp;WPARAM&nbsp;wBindParam)<br /></span><span style="color: #008080">&nbsp;3</span><span style="color: #000000"><img id="Codehighlighter1_65_456_Open_Image" onclick="this.style.display='none'; Codehighlighter1_65_456_Open_Text.style.display='none'; Codehighlighter1_65_456_Closed_Image.style.display='inline'; Codehighlighter1_65_456_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_65_456_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_65_456_Closed_Text.style.display='none'; Codehighlighter1_65_456_Open_Image.style.display='inline'; Codehighlighter1_65_456_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_65_456_Closed_Text"><img alt="" src="http://www.cppblog.com/Images/dot.gif" /></span><span id="Codehighlighter1_65_456_Open_Text"><span style="color: #000000">{<br /></span><span style="color: #008080">&nbsp;4</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&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;5</span><span style="color: #008000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ASSERT(m_pIQueueService</span><span style="color: #000000">!=</span><span style="color: #000000">NULL);<br /></span><span style="color: #008080">&nbsp;6</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(m_pIQueueService</span><span style="color: #000000">==</span><span style="color: #000000">NULL)&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">false</span><span style="color: #000000">;<br /></span><span style="color: #008080">&nbsp;7</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" /><br /></span><span style="color: #008080">&nbsp;8</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&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;9</span><span style="color: #008000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CThreadLockHandle&nbsp;BufferLockHandle(</span><span style="color: #000000">&amp;</span><span style="color: #000000">m_BufferLock);<br /></span><span style="color: #008080">10</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" /><br /></span><span style="color: #008080">11</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&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">12</span><span style="color: #008000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NTY_TimerEvent&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;pTimerEvent</span><span style="color: #000000">=</span><span style="color: #000000">(NTY_TimerEvent&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">)m_cbBuffer;<br /></span><span style="color: #008080">13</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pTimerEvent</span><span style="color: #000000">-&gt;</span><span style="color: #000000">wTimerID</span><span style="color: #000000">=</span><span style="color: #000000">wTimerID;<br /></span><span style="color: #008080">14</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pTimerEvent</span><span style="color: #000000">-&gt;</span><span style="color: #000000">wBindParam</span><span style="color: #000000">=</span><span style="color: #000000">wBindParam;<br /></span><span style="color: #008080">15</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_pIQueueService</span><span style="color: #000000">-&gt;</span><span style="color: #000000">AddToQueue(EVENT_TIMER,m_cbBuffer,</span><span style="color: #0000ff">sizeof</span><span style="color: #000000">(NTY_TimerEvent));<br /></span><span style="color: #008080">16</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" /><br /></span><span style="color: #008080">17</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">true</span><span style="color: #000000">;<br /></span><span style="color: #008080">18</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></div>嗯哼，代码质量很高哈，，，<br />入口都有断言在debug阶段帮助暴露错误，断言之后还有if语句再次判断，这样即使release版本错误也不会被漏掉，，，<br />关于事件的封装，在这里其实已经分层了，，，<br /><br />这里是第一层：<br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080">1</span><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" /><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;tagDataHead<br /></span><span style="color: #008080">2</span><span style="color: #000000"><img style="display: inline" id="Codehighlighter1_19_133_Open_Image" onclick="this.style.display='none'; Codehighlighter1_19_133_Open_Text.style.display='none'; Codehighlighter1_19_133_Closed_Image.style.display='inline'; Codehighlighter1_19_133_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="width: 11px; display: none; height: 16px" id="Codehighlighter1_19_133_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_19_133_Closed_Text.style.display='none'; Codehighlighter1_19_133_Open_Image.style.display='inline'; Codehighlighter1_19_133_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" width="11" height="16"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_19_133_Closed_Text"><img alt="" src="http://www.cppblog.com/Images/dot.gif" /></span><span style="display: inline" id="Codehighlighter1_19_133_Open_Text"><span style="color: #000000">{<br /></span><span style="color: #008080">3</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;WORD&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;wDataSize;&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">4</span><span style="color: #008000"><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;WORD&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;wIdentifier;&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">5</span><span style="color: #008000"><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;DWORD&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;dwInsertTime;&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">6</span><span style="color: #008000"><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" /></span><span style="color: #000000">}</span></span><span style="color: #000000">;</span></div>这一层实际上是由CDataStorage负责打包管理，在CQueueServiceEvent执行PostTimerEvent操作的时候会在内部调用CQueueService的add最终调用到CDataStrorage的Add来打包数据,这里的结构也是非常像网络数据包|-&nbsp;len -|-&nbsp;type -|-&nbsp;data -|。<br />在来看Post这一层做的数据打包：<br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080">1</span><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" /><span style="color: #008000">//</span><span style="color: #008000">定时器事件</span><span style="color: #008000"><br /></span><span style="color: #008080">2</span><span style="color: #008000"><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;NTY_TimerEvent<br /></span><span style="color: #008080">3</span><span style="color: #000000"><img id="Codehighlighter1_30_108_Open_Image" onclick="this.style.display='none'; Codehighlighter1_30_108_Open_Text.style.display='none'; Codehighlighter1_30_108_Closed_Image.style.display='inline'; Codehighlighter1_30_108_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_30_108_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_30_108_Closed_Text.style.display='none'; Codehighlighter1_30_108_Open_Image.style.display='inline'; Codehighlighter1_30_108_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_30_108_Closed_Text"><img alt="" src="http://www.cppblog.com/Images/dot.gif" /></span><span id="Codehighlighter1_30_108_Open_Text"><span style="color: #000000">{<br /></span><span style="color: #008080">4</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;WORD&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;wTimerID;&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">定时器&nbsp;ID</span><span style="color: #008000"><br /></span><span style="color: #008080">5</span><span style="color: #008000"><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;WPARAM&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;wBindParam;&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">6</span><span style="color: #008000"><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" /></span><span style="color: #000000">}</span></span><span style="color: #000000">;</span></div>|- len -|- type -|-&nbsp;sub protocl&nbsp;-|。<br />其他事件的打包过程都是类似的：<br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080">&nbsp;1</span><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" /><span style="color: #008000">//</span><span style="color: #008000">数据库请求事件</span><span style="color: #008000"><br /></span><span style="color: #008080">&nbsp;2</span><span style="color: #008000"><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;NTY_DataBaseEvent<br /></span><span style="color: #008080">&nbsp;3</span><span style="color: #000000"><img id="Codehighlighter1_35_143_Open_Image" onclick="this.style.display='none'; Codehighlighter1_35_143_Open_Text.style.display='none'; Codehighlighter1_35_143_Closed_Image.style.display='inline'; Codehighlighter1_35_143_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_35_143_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_35_143_Closed_Text.style.display='none'; Codehighlighter1_35_143_Open_Image.style.display='inline'; Codehighlighter1_35_143_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_35_143_Closed_Text"><img alt="" src="http://www.cppblog.com/Images/dot.gif" /></span><span id="Codehighlighter1_35_143_Open_Text"><span style="color: #000000">{<br /></span><span style="color: #008080">&nbsp;4</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;WORD&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;wIndex;&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;</span><span style="color: #008000">//</span><span style="color: #008000">对象索引</span><span style="color: #008000"><br /></span><span style="color: #008080">&nbsp;5</span><span style="color: #008000"><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;WORD&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;wRoundID;&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">&nbsp;6</span><span style="color: #008000"><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;WORD&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;wRequestID;&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">&nbsp;7</span><span style="color: #008000"><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" /></span><span style="color: #000000">}</span></span><span style="color: #000000">;<br /></span><span style="color: #008080">&nbsp;8</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" /><br /></span><span style="color: #008080">&nbsp;9</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" /></span><span style="color: #008000">//</span><span style="color: #008000">网络应答事件</span><span style="color: #008000"><br /></span><span style="color: #008080">10</span><span style="color: #008000"><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;NTY_SocketAcceptEvent<br /></span><span style="color: #008080">11</span><span style="color: #000000"><img id="Codehighlighter1_185_294_Open_Image" onclick="this.style.display='none'; Codehighlighter1_185_294_Open_Text.style.display='none'; Codehighlighter1_185_294_Closed_Image.style.display='inline'; Codehighlighter1_185_294_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_185_294_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_185_294_Closed_Text.style.display='none'; Codehighlighter1_185_294_Open_Image.style.display='inline'; Codehighlighter1_185_294_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_185_294_Closed_Text"><img alt="" src="http://www.cppblog.com/Images/dot.gif" /></span><span id="Codehighlighter1_185_294_Open_Text"><span style="color: #000000">{<br /></span><span style="color: #008080">12</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;WORD&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;wIndex;&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;</span><span style="color: #008000">//</span><span style="color: #008000">连接索引</span><span style="color: #008000"><br /></span><span style="color: #008080">13</span><span style="color: #008000"><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;WORD&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;wRoundID;&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">14</span><span style="color: #008000"><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;DWORD&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;dwClientIP;&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">15</span><span style="color: #008000"><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" /></span><span style="color: #000000">}</span></span><span style="color: #000000">;<br /></span><span style="color: #008080">16</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" /><br /></span><span style="color: #008080">17</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" /></span><span style="color: #008000">//</span><span style="color: #008000">网络读取事件</span><span style="color: #008000"><br /></span><span style="color: #008080">18</span><span style="color: #008000"><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;NTY_SocketReadEvent<br /></span><span style="color: #008080">19</span><span style="color: #000000"><img id="Codehighlighter1_334_481_Open_Image" onclick="this.style.display='none'; Codehighlighter1_334_481_Open_Text.style.display='none'; Codehighlighter1_334_481_Closed_Image.style.display='inline'; Codehighlighter1_334_481_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_334_481_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_334_481_Closed_Text.style.display='none'; Codehighlighter1_334_481_Open_Image.style.display='inline'; Codehighlighter1_334_481_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_334_481_Closed_Text"><img alt="" src="http://www.cppblog.com/Images/dot.gif" /></span><span id="Codehighlighter1_334_481_Open_Text"><span style="color: #000000">{<br /></span><span style="color: #008080">20</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;WORD&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;wIndex;&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;</span><span style="color: #008000">//</span><span style="color: #008000">连接索引</span><span style="color: #008000"><br /></span><span style="color: #008080">21</span><span style="color: #008000"><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;WORD&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;wRoundID;&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">22</span><span style="color: #008000"><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;WORD&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;wDataSize;&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">23</span><span style="color: #008000"><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;CMD_Command&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Command;&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">24</span><span style="color: #008000"><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" /></span><span style="color: #000000">}</span></span><span style="color: #000000">;<br /></span><span style="color: #008080">25</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" /><br /></span><span style="color: #008080">26</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" /></span><span style="color: #008000">//</span><span style="color: #008000">网络关闭事件</span><span style="color: #008000"><br /></span><span style="color: #008080">27</span><span style="color: #008000"><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;NTY_SocketCloseEvent<br /></span><span style="color: #008080">28</span><span style="color: #000000"><img id="Codehighlighter1_522_672_Open_Image" onclick="this.style.display='none'; Codehighlighter1_522_672_Open_Text.style.display='none'; Codehighlighter1_522_672_Closed_Image.style.display='inline'; Codehighlighter1_522_672_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_522_672_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_522_672_Closed_Text.style.display='none'; Codehighlighter1_522_672_Open_Image.style.display='inline'; Codehighlighter1_522_672_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_522_672_Closed_Text"><img alt="" src="http://www.cppblog.com/Images/dot.gif" /></span><span id="Codehighlighter1_522_672_Open_Text"><span style="color: #000000">{<br /></span><span style="color: #008080">29</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;WORD&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;wIndex;&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;</span><span style="color: #008000">//</span><span style="color: #008000">连接索引</span><span style="color: #008000"><br /></span><span style="color: #008080">30</span><span style="color: #008000"><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;WORD&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;wRoundID;&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">31</span><span style="color: #008000"><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;DWORD&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;dwClientIP;&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">32</span><span style="color: #008000"><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;DWORD&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;dwConnectSecond;&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">33</span><span style="color: #008000"><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" /></span><span style="color: #000000">}</span></span><span style="color: #000000">;</span></div><br /><br />还是一样，一句话总结CQueueServiceEvent：<br />线程安全的接受各种异步事件，并打包封装好以后插入到关联的制定IQueueService中.<br /><br /><br /><br /><img src ="http://www.cppblog.com/Error/aggbug/147948.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Error/" target="_blank">Enic</a> 2011-06-02 14:36 <a href="http://www.cppblog.com/Error/articles/147948.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ServerKernel中的IQueueService接口分析</title><link>http://www.cppblog.com/Error/articles/147691.html</link><dc:creator>Enic</dc:creator><author>Enic</author><pubDate>Mon, 30 May 2011 08:10:00 GMT</pubDate><guid>http://www.cppblog.com/Error/articles/147691.html</guid><wfw:comment>http://www.cppblog.com/Error/comments/147691.html</wfw:comment><comments>http://www.cppblog.com/Error/articles/147691.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/Error/comments/commentRss/147691.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Error/services/trackbacks/147691.html</trackback:ping><description><![CDATA[<p align="left">相关UML如下：<br /><img border="0" alt="" src="http://www.cppblog.com/images/cppblog_com/error/17010/o_IQueueService.jpg" width="407" longdesc="" height="236" /><br /><br />添加：<br /><br /><img border="0" alt="" src="http://www.cppblog.com/images/cppblog_com/error/17010/o_IQueueService_add_data.jpg" width="480" longdesc="" height="382" /><br /><br />处理<br /><img border="0" alt="" src="http://www.cppblog.com/images/cppblog_com/error/17010/o_IQueueService_process_data.jpg" width="689" longdesc="" height="415" /><br /><br /><br />关键代码解析：<br /></p>
<p align="left"></p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080">&nbsp;1</span><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><span style="color: #008000">//</span><span style="color: #008000">开始服务</span><span style="color: #008000"><br /></span><span style="color: #008080">&nbsp;2</span><span style="color: #008000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;__cdecl&nbsp;CQueueService::StartService()<br /></span><span style="color: #008080">&nbsp;3</span><span style="color: #000000"><img style="display: inline" id="Codehighlighter1_50_680_Open_Image" onclick="this.style.display='none'; Codehighlighter1_50_680_Open_Text.style.display='none'; Codehighlighter1_50_680_Closed_Image.style.display='inline'; Codehighlighter1_50_680_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_50_680_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_50_680_Closed_Text.style.display='none'; Codehighlighter1_50_680_Open_Image.style.display='inline'; Codehighlighter1_50_680_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_50_680_Closed_Text"><img alt="" src="http://www.cppblog.com/Images/dot.gif" /></span><span style="display: inline" id="Codehighlighter1_50_680_Open_Text"><span style="color: #000000">{<br /></span><span style="color: #008080">&nbsp;4</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&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;5</span><span style="color: #008000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;ASSERT(m_bService</span><span style="color: #000000">==</span><span style="color: #0000ff">false</span><span style="color: #000000">);<br /></span><span style="color: #008080">&nbsp;6</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;ASSERT(m_hCompletionPort</span><span style="color: #000000">==</span><span style="color: #000000">NULL);<br /></span><span style="color: #008080">&nbsp;7</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;ASSERT(m_pIQueueServiceSink</span><span style="color: #000000">!=</span><span style="color: #000000">NULL);<br /></span><span style="color: #008080">&nbsp;8</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" /><br /></span><span style="color: #008080">&nbsp;9</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">建立完成端口<br /></span><span style="color: #008080">10</span><span style="color: #008000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">!&nbsp;需要追踪一下这里的完成端口句柄<br /></span><span style="color: #008080">11</span><span style="color: #008000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">!&nbsp;首先分析这里的创建，INVALID_HANDLE_VALUE表示没有关联任何文件句柄，也就是<br /></span><span style="color: #008080">12</span><span style="color: #008000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">!&nbsp;说不存在某个实现某个操作完成以后系统自动给这个完成端口post一个完成消息的概念<br /></span><span style="color: #008080">13</span><span style="color: #008000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">!&nbsp;然后这里用限制工作线程数是1，也就是同意时刻只会有一条线程受到完成消息</span><span style="color: #008000"><br /></span><span style="color: #008080">14</span><span style="color: #008000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;m_hCompletionPort</span><span style="color: #000000">=</span><span style="color: #000000">CreateIoCompletionPort(INVALID_HANDLE_VALUE,NULL,NULL,</span><span style="color: #000000">1</span><span style="color: #000000">);<br /></span><span style="color: #008080">15</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(m_hCompletionPort</span><span style="color: #000000">==</span><span style="color: #000000">NULL)&nbsp;</span><span style="color: #0000ff">throw</span><span style="color: #000000">&nbsp;TEXT(</span><span style="color: #000000">"</span><span style="color: #000000">队列对象完成端口创建失败</span><span style="color: #000000">"</span><span style="color: #000000">);<br /></span><span style="color: #008080">16</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" /><br /></span><span style="color: #008080">17</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&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">18</span><span style="color: #008000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(m_QueueServiceThread.InitThread(m_hCompletionPort)</span><span style="color: #000000">==</span><span style="color: #0000ff">false</span><span style="color: #000000">)&nbsp;</span><span style="color: #0000ff">throw</span><span style="color: #000000">&nbsp;TEXT(</span><span style="color: #000000">"</span><span style="color: #000000">队列对象线程初始化失败</span><span style="color: #000000">"</span><span style="color: #000000">);<br /></span><span style="color: #008080">19</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(m_QueueServiceThread.StartThead()</span><span style="color: #000000">==</span><span style="color: #0000ff">false</span><span style="color: #000000">)&nbsp;</span><span style="color: #0000ff">throw</span><span style="color: #000000">&nbsp;TEXT(</span><span style="color: #000000">"</span><span style="color: #000000">队列对象线程启动失败</span><span style="color: #000000">"</span><span style="color: #000000">);<br /></span><span style="color: #008080">20</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" /><br /></span><span style="color: #008080">21</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&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">22</span><span style="color: #008000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;m_bService</span><span style="color: #000000">=</span><span style="color: #0000ff">true</span><span style="color: #000000">;<br /></span><span style="color: #008080">23</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" /><br /></span><span style="color: #008080">24</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">true</span><span style="color: #000000">;<br /></span><span style="color: #008080">25</span><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" />}</span></span></div><br />
<p align="left">m_QueueServiceThread.InitThread(m_hCompletionPort);<br />他悄悄的给完成端口句柄扔给了服务线程，偶们去看看服务线程拿这玩意干了啥，，，</p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><span style="color: #008000">//</span><span style="color: #008000">运行函数</span><span style="color: #008000"><br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;CQueueServiceThread::RepetitionRun()<br /><img id="Codehighlighter1_49_658_Open_Image" onclick="this.style.display='none'; Codehighlighter1_49_658_Open_Text.style.display='none'; Codehighlighter1_49_658_Closed_Image.style.display='inline'; Codehighlighter1_49_658_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_49_658_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_49_658_Closed_Text.style.display='none'; Codehighlighter1_49_658_Open_Image.style.display='inline'; Codehighlighter1_49_658_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_49_658_Closed_Text"><img alt="" src="http://www.cppblog.com/Images/dot.gif" /></span><span id="Codehighlighter1_49_658_Open_Text"><span style="color: #000000">{<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">效验参数</span><span style="color: #008000"><br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;ASSERT(m_hCompletionPort</span><span style="color: #000000">!=</span><span style="color: #000000">NULL);<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" /><br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">变量定义</span><span style="color: #008000"><br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;dwThancferred</span><span style="color: #000000">=</span><span style="color: #000000">0</span><span style="color: #000000">;<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;OVERLAPPED&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;pOverLapped</span><span style="color: #000000">=</span><span style="color: #000000">NULL;<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;CQueueService&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;pQueueService</span><span style="color: #000000">=</span><span style="color: #000000">NULL;<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" /><br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">等待完成端口</span><span style="color: #008000"><br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(GetQueuedCompletionStatus(m_hCompletionPort,</span><span style="color: #000000">&amp;</span><span style="color: #000000">dwThancferred,(PULONG_PTR)</span><span style="color: #000000">&amp;</span><span style="color: #000000">pQueueService,</span><span style="color: #000000">&amp;</span><span style="color: #000000">pOverLapped,INFINITE))<br /><img id="Codehighlighter1_322_640_Open_Image" onclick="this.style.display='none'; Codehighlighter1_322_640_Open_Text.style.display='none'; Codehighlighter1_322_640_Closed_Image.style.display='inline'; Codehighlighter1_322_640_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_322_640_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_322_640_Closed_Text.style.display='none'; Codehighlighter1_322_640_Open_Image.style.display='inline'; Codehighlighter1_322_640_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_322_640_Closed_Text"><img alt="" src="http://www.cppblog.com/Images/dot.gif" /></span><span id="Codehighlighter1_322_640_Open_Text"><span style="color: #000000">{<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">判断退出</span><span style="color: #008000"><br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(pQueueService</span><span style="color: #000000">==</span><span style="color: #000000">NULL)&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">false</span><span style="color: #000000">;<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" /><br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">获取数据</span><span style="color: #008000"><br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tagDataHead&nbsp;DataHead;<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;bSuccess</span><span style="color: #000000">=</span><span style="color: #000000">pQueueService</span><span style="color: #000000">-&gt;</span><span style="color: #000000">GetData(DataHead,m_cbBuffer,</span><span style="color: #0000ff">sizeof</span><span style="color: #000000">(m_cbBuffer));<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ASSERT(bSuccess</span><span style="color: #000000">==</span><span style="color: #0000ff">true</span><span style="color: #000000">);<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" /><br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">处理数据</span><span style="color: #008000"><br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(bSuccess</span><span style="color: #000000">==</span><span style="color: #0000ff">true</span><span style="color: #000000">)&nbsp;pQueueService</span><span style="color: #000000">-&gt;</span><span style="color: #000000">OnQueueServiceThread(DataHead,m_cbBuffer,DataHead.wDataSize);<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" /><br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">true</span><span style="color: #000000">;<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" /><br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">false</span><span style="color: #000000">;<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" />}</span></span></div>
<p align="left"><br /><br />秘密在此：<br />GetQueuedCompletionStatus(m_hCompletionPort,<span style="color: #000000">&amp;</span><span style="color: #000000">dwThancferred,(PULONG_PTR)</span><span style="color: #000000">&amp;</span><span style="color: #000000">pQueueService,</span><span style="color: #000000">&amp;</span><span style="color: #000000">pOverLapped,INFINITE)<br />m_hCompletionPort是通过线程参数传递进来的，<span style="color: #000000">dwThancferred</span>和<span style="color: #000000">pQueueService</span>是在之前CQueueService::AddToQueue()中Post过来的参数，，，</p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><span style="color: #008000">//</span><span style="color: #008000">加入数据</span><span style="color: #008000"><br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;__cdecl&nbsp;CQueueService::AddToQueue(WORD&nbsp;wIdentifier,&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;pBuffer,&nbsp;WORD&nbsp;wDataSize)<br /><img id="Codehighlighter1_102_298_Open_Image" onclick="this.style.display='none'; Codehighlighter1_102_298_Open_Text.style.display='none'; Codehighlighter1_102_298_Closed_Image.style.display='inline'; Codehighlighter1_102_298_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_102_298_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_102_298_Closed_Text.style.display='none'; Codehighlighter1_102_298_Open_Image.style.display='inline'; Codehighlighter1_102_298_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_102_298_Closed_Text"><img alt="" src="http://www.cppblog.com/Images/dot.gif" /></span><span id="Codehighlighter1_102_298_Open_Text"><span style="color: #000000">{<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;CThreadLockHandle&nbsp;LockHandle(</span><span style="color: #000000">&amp;</span><span style="color: #000000">m_ThreadLock);<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;m_DataStorage.AddData(wIdentifier,pBuffer,wDataSize);<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;PostQueuedCompletionStatus(m_hCompletionPort,wDataSize,(ULONG_PTR)</span><span style="color: #0000ff">this</span><span style="color: #000000">,NULL);<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">true</span><span style="color: #000000">;<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" />}</span></span></div>
<p align="left"><br />数据经过完成端口在CQueueServiceThread绕一圈以后会回到CQueueService::OnQueueServiceThread()</p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><span style="color: #008000">//</span><span style="color: #008000">数据消息</span><span style="color: #008000"><br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;CQueueService::OnQueueServiceThread(</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;tagDataHead&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">&nbsp;DataHead,&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;pBuffer,&nbsp;WORD&nbsp;wDataSize)<br /><img id="Codehighlighter1_110_303_Open_Image" onclick="this.style.display='none'; Codehighlighter1_110_303_Open_Text.style.display='none'; Codehighlighter1_110_303_Closed_Image.style.display='inline'; Codehighlighter1_110_303_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_110_303_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_110_303_Closed_Text.style.display='none'; Codehighlighter1_110_303_Open_Image.style.display='inline'; Codehighlighter1_110_303_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_110_303_Closed_Text"><img alt="" src="http://www.cppblog.com/Images/dot.gif" /></span><span id="Codehighlighter1_110_303_Open_Text"><span style="color: #000000">{<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;ASSERT(m_pIQueueServiceSink</span><span style="color: #000000">!=</span><span style="color: #000000">NULL);<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;<br /><img id="Codehighlighter1_156_276_Open_Image" onclick="this.style.display='none'; Codehighlighter1_156_276_Open_Text.style.display='none'; Codehighlighter1_156_276_Closed_Image.style.display='inline'; Codehighlighter1_156_276_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_156_276_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_156_276_Closed_Text.style.display='none'; Codehighlighter1_156_276_Open_Image.style.display='inline'; Codehighlighter1_156_276_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_156_276_Closed_Text"><img alt="" src="http://www.cppblog.com/Images/dot.gif" /></span><span id="Codehighlighter1_156_276_Open_Text"><span style="color: #000000">{&nbsp;<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_pIQueueServiceSink</span><span style="color: #000000">-&gt;</span><span style="color: #000000">OnQueueServiceSink(DataHead.wIdentifier,pBuffer,DataHead.wDataSize,DataHead.dwInsertTime);&nbsp;<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /><img id="Codehighlighter1_291_292_Open_Image" onclick="this.style.display='none'; Codehighlighter1_291_292_Open_Text.style.display='none'; Codehighlighter1_291_292_Closed_Image.style.display='inline'; Codehighlighter1_291_292_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_291_292_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_291_292_Closed_Text.style.display='none'; Codehighlighter1_291_292_Open_Image.style.display='inline'; Codehighlighter1_291_292_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">catch</span><span style="color: #000000">&nbsp;(<img alt="" src="http://www.cppblog.com/Images/dot.gif" />)&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_291_292_Closed_Text"><img alt="" src="http://www.cppblog.com/Images/dot.gif" /></span><span id="Codehighlighter1_291_292_Open_Text"><span style="color: #000000">{}</span></span><span style="color: #000000"><br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">;<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" />}</span></span></div>
<p align="left"><br /><br />这样队列服务就完成了他的使命，将执行的消息，异步的交给指定接口去处理，，，<br /><br /><br />稍后将对列队列服务做个宏观上的的分析，，，下班时间到，，，回去继续，，，<br /></span><br /><br /><br />用一句话来描述QueueService模块就是：<br />将队列的插入和处理通过关联到完成端口上以实现在IOCP线程池管理下异步处理；<br />Add以后投递完成消息，在完成端口上监听的线程受到消息以后读取数据并处理；<br /></p><img src ="http://www.cppblog.com/Error/aggbug/147691.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Error/" target="_blank">Enic</a> 2011-05-30 16:10 <a href="http://www.cppblog.com/Error/articles/147691.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>