﻿<?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++博客-markqian86-随笔分类-架构随笔</title><link>http://www.cppblog.com/markqian86/category/21314.html</link><description>practice makes perfect，阅读、分析、练习、总结。</description><language>zh-cn</language><lastBuildDate>Thu, 12 Mar 2020 13:20:37 GMT</lastBuildDate><pubDate>Thu, 12 Mar 2020 13:20:37 GMT</pubDate><ttl>60</ttl><item><title>Windows性能监视器-性能分析</title><link>http://www.cppblog.com/markqian86/archive/2020/03/12/217197.html</link><dc:creator>长戟十三千</dc:creator><author>长戟十三千</author><pubDate>Thu, 12 Mar 2020 03:19:00 GMT</pubDate><guid>http://www.cppblog.com/markqian86/archive/2020/03/12/217197.html</guid><wfw:comment>http://www.cppblog.com/markqian86/comments/217197.html</wfw:comment><comments>http://www.cppblog.com/markqian86/archive/2020/03/12/217197.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/markqian86/comments/commentRss/217197.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/markqian86/services/trackbacks/217197.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;3。磁盘I/O分析方法&nbsp;&nbsp;&nbsp;&nbsp; (1)计算每磁盘的I/O数每磁盘的I/O数可用来与磁盘的I/O能力进行对比，如果经过计算得到的每磁盘I/O数超过了磁盘标称的I/O能力，则说明确实存在磁盘的性能瓶颈。&nbsp;&nbsp;&nbsp; &nbsp;(2)与Processor: Privileged Time&nbsp;合并进行分析&n...&nbsp;&nbsp;<a href='http://www.cppblog.com/markqian86/archive/2020/03/12/217197.html'>阅读全文</a><img src ="http://www.cppblog.com/markqian86/aggbug/217197.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/markqian86/" target="_blank">长戟十三千</a> 2020-03-12 11:19 <a href="http://www.cppblog.com/markqian86/archive/2020/03/12/217197.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>有趣的算法和策略</title><link>http://www.cppblog.com/markqian86/archive/2020/01/16/217088.html</link><dc:creator>长戟十三千</dc:creator><author>长戟十三千</author><pubDate>Thu, 16 Jan 2020 08:32:00 GMT</pubDate><guid>http://www.cppblog.com/markqian86/archive/2020/01/16/217088.html</guid><wfw:comment>http://www.cppblog.com/markqian86/comments/217088.html</wfw:comment><comments>http://www.cppblog.com/markqian86/archive/2020/01/16/217088.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/markqian86/comments/commentRss/217088.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/markqian86/services/trackbacks/217088.html</trackback:ping><description><![CDATA[1、共享内存实现跨进程消息队列：《UNIX网络编程卷2》，消息队列，p85<br />&nbsp; &nbsp; &nbsp; offset识别结构体内容，防止重复加载内存地址变更。共享信号量或者无锁环形队列，MAGIC NUMBER 验证，防止版本不一致。<br /><br />2、虚拟实时：《linux内核设计与实现》, 进程调度，p43<br />&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;调度时使用时间记账。虚拟运行时间 +=加权(上一帧运行时间); while {run get_task( min(虚拟运行时间) ) ;}(true);<br />&nbsp; &nbsp; &nbsp;移动检测时曾用到过异常移动的加权算法，与这个类似。每步移动异常加权，总量超过后，执行 禁止移动时间=异常总量/速度 的惩罚。<br /><br />3、等待队列：《linux内核设计与实现》, 进程调度，p50<br />&nbsp; &nbsp;在读列上自旋，没有事件则调度等待，否则返回。<br /><br />epoll源码：自旋锁+就绪队列，mutex+红黑树数据<br />无限法则服务器：接口-&gt;协程+rpc-&gt;服务组件， 可灰更微服务，共享内存1s拉起，接口自动测试，全局锁服务器用于独占某些服务或操作。<br />ECS模式：word=system+entity; system=sys1+sys2+sysn; entity=componentN;<br />位标记的静态数组：int info_flg; T vct_info;&nbsp;《linux内核设计与实现》, 软中断，p111。 tasklet：利用静态软中断，添加调度策略：高低优先级链表。ksoftirqd：每个cpu上低优先级内核线程池，处理高并发软中断，防止造成用户线程饥饿。<img src ="http://www.cppblog.com/markqian86/aggbug/217088.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/markqian86/" target="_blank">长戟十三千</a> 2020-01-16 16:32 <a href="http://www.cppblog.com/markqian86/archive/2020/01/16/217088.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>对战平台虚拟War3局域网的原理</title><link>http://www.cppblog.com/markqian86/archive/2019/11/19/216983.html</link><dc:creator>长戟十三千</dc:creator><author>长戟十三千</author><pubDate>Tue, 19 Nov 2019 09:16:00 GMT</pubDate><guid>http://www.cppblog.com/markqian86/archive/2019/11/19/216983.html</guid><wfw:comment>http://www.cppblog.com/markqian86/comments/216983.html</wfw:comment><comments>http://www.cppblog.com/markqian86/archive/2019/11/19/216983.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/markqian86/comments/commentRss/216983.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/markqian86/services/trackbacks/216983.html</trackback:ping><description><![CDATA[<p style="outline: 0px; padding: 0px; font-family: &quot;Microsoft YaHei&quot;, &quot;SF Pro Display&quot;, Roboto, Noto, Arial, &quot;PingFang SC&quot;, sans-serif; box-sizing: border-box; font-size: 16px; color: #4d4d4d; line-height: 26px; margin: 0px 0px 16px; overflow-x: auto; word-wrap: break-word; background-color: #ffffff;">以War3为例,启动魔兽后,首先是如何看见主机的问题：<br style="outline: 0px; margin: 0px; padding: 0px; box-sizing: border-box; word-wrap: break-word;" />魔兽是通过TCP/UDP协议进行数据发送的，那如何实现看到对方？我们这样：每个机器监听一个固定的UDP端口(比如6112)，一旦任何机器建立主机，它就向整个局域网所有的机器的6112端口广播&#8220;我建立了主机&#8221;的信息，这样，其他机器接收到这个信息,就知道有主机建立了（广播只存在于UDP协议，使用UDP.sendto向地址255.255.255.255实现）。<br style="outline: 0px; margin: 0px; padding: 0px; box-sizing: border-box; word-wrap: break-word;" /><br style="outline: 0px; margin: 0px; padding: 0px; box-sizing: border-box; word-wrap: break-word;" />来看看HF和VS平台怎么实现的:<br style="outline: 0px; margin: 0px; padding: 0px; box-sizing: border-box; word-wrap: break-word;" />1.挂钩UDP.Sendto，将所有广播信息(即发向地址255.255.255.255)的消息截获,然后把消息重新打包(比如{本机虚拟IP+消息数据}的形式),然后使用真正的UDP.sendto把消息转到平台服务器,服务器查看有哪些玩家是跟此玩家在同一房间，把消息传给那些玩家；平台再挂钩住接收消息用的UDP.recv From，把UDP.recvFrom的发送方地址修改为消息中的对方虚拟IP，再把数据传给真正的UDP.recvFr om。<br style="outline: 0px; margin: 0px; padding: 0px; box-sizing: border-box; word-wrap: break-word;" /><br style="outline: 0px; margin: 0px; padding: 0px; box-sizing: border-box; word-wrap: break-word;" />问：万一广播信息不是建立主机而是其他的，被误截了怎么办？<br style="outline: 0px; margin: 0px; padding: 0px; box-sizing: border-box; word-wrap: break-word;" />答：大部分游戏包括War3的广播信息唯一的作用就是传播&#8220;建立主机&#8221;这一类需要传给所有局域网的机器的信息，就是说只有&#8220;建立主机&#8221;这一类信息会通过地址255.255.255，因此一般不会有误截发生。<br style="outline: 0px; margin: 0px; padding: 0px; box-sizing: border-box; word-wrap: break-word;" /><br style="outline: 0px; margin: 0px; padding: 0px; box-sizing: border-box; word-wrap: break-word;" />实际上通过广播的信息还有主机是否人满，地图，主机是否取消建立，等信息。<br style="outline: 0px; margin: 0px; padding: 0px; box-sizing: border-box; word-wrap: break-word;" /><br style="outline: 0px; margin: 0px; padding: 0px; box-sizing: border-box; word-wrap: break-word;" /><br style="outline: 0px; margin: 0px; padding: 0px; box-sizing: border-box; word-wrap: break-word;" />其次，如何加入游戏：<br style="outline: 0px; margin: 0px; padding: 0px; box-sizing: border-box; word-wrap: break-word;" />魔兽在加入游戏后使用TCP协议，每个玩家对应一个连接。<br style="outline: 0px; margin: 0px; padding: 0px; box-sizing: border-box; word-wrap: break-word;" />在真正的局域网中，一个玩家看到和选择一个主机后点击加入，他的机器会使用TCP请求和对方连接，（地址从UDP中获得，端口是固定的6112），如果没有人满，被主机关闭等意外发生，主机就会答应此连接(使用TCP.accept)，发送些数据(地图信息，其他玩家信息等)，此玩家就加入了游戏，此后两机器就使用这个TCP连接通讯。<br style="outline: 0px; margin: 0px; padding: 0px; box-sizing: border-box; word-wrap: break-word;" /><br style="outline: 0px; margin: 0px; padding: 0px; box-sizing: border-box; word-wrap: break-word;" />回到平台，在平台中，魔兽从UDP中获得的地址是服务器的地址啊（因为UDP信息是服务器转过来的)，这样发起的TCP只能链接到服务器，怎么可能连接得上真正的玩家呢？别忘了，上面说过平台挂钩了UDP.sendTo(会把本机虚拟IP加入);挂钩了UDP.recvFrom(会把服务器这个发送方的IP改为对方虚拟IP)；<br style="outline: 0px; margin: 0px; padding: 0px; box-sizing: border-box; word-wrap: break-word;" /><br style="outline: 0px; margin: 0px; padding: 0px; box-sizing: border-box; word-wrap: break-word;" />接着魔兽向对方虚拟IP发起TCP.connect，可能成功吗？当然不可能，因为实际的局域网中根本没这个IP，那怎么请求连接和接受连接呢？<br style="outline: 0px; margin: 0px; padding: 0px; box-sizing: border-box; word-wrap: break-word;" /><br style="outline: 0px; margin: 0px; padding: 0px; box-sizing: border-box; word-wrap: break-word;" />平台采用了这样的办法：TCP连接是靠TCP.connect发起的,平台挂钩住这个函数，把连接向服务器的地址修改为自己(即127.0.0.1或实际IP,一般用前者),然后再挂钩TCP.accept函数(此函数用来接受TCP连接),然后发送同样的连接请求由服务器转到另一台机器(即主机),根据那台机器的做法决定是否答应127.0.0.1的那个TCP.connect，(注意这个TCP.accept返回的新连接是挂钩代码创建的，挂钩的代码拥有它收到的所有数据)，如果答应连接的话,是不是魔兽所有的数据就会发送到这个挂钩代码创建的连接这里了？<br style="outline: 0px; margin: 0px; padding: 0px; box-sizing: border-box; word-wrap: break-word;" />接着，挂钩代码把这些数据重新打包（例如{接收方机器的虚拟IP+发送数据+发送方的虚拟IP}的形式）,使用UDP.sendto发到服务器,服务器从信息中获得接收方机器的虚拟IP，查找其真正的IP，并把数据发送过去，跨网的TCP发送就完成了。<br style="outline: 0px; margin: 0px; padding: 0px; box-sizing: border-box; word-wrap: break-word;" />（另外一台机器也按以上方法同样处理）</p><p style="outline: 0px; padding: 0px; font-family: &quot;Microsoft YaHei&quot;, &quot;SF Pro Display&quot;, Roboto, Noto, Arial, &quot;PingFang SC&quot;, sans-serif; box-sizing: border-box; font-size: 16px; color: #4d4d4d; line-height: 26px; margin: 0px 0px 16px; overflow-x: auto; word-wrap: break-word; background-color: #ffffff;">&nbsp;</p><p style="outline: 0px; padding: 0px; font-family: &quot;Microsoft YaHei&quot;, &quot;SF Pro Display&quot;, Roboto, Noto, Arial, &quot;PingFang SC&quot;, sans-serif; box-sizing: border-box; font-size: 16px; color: #4d4d4d; line-height: 26px; margin: 0px 0px 16px; overflow-x: auto; word-wrap: break-word; background-color: #ffffff;">&nbsp;</p><div style="outline: 0px; margin: 0px; box-sizing: border-box; word-wrap: break-word; color: #333333; font-family: -apple-system, &quot;SF UI Text&quot;, Arial, &quot;PingFang SC&quot;, &quot;Hiragino Sans GB&quot;, &quot;Microsoft YaHei&quot;, &quot;WenQuanYi Micro Hei&quot;, sans-serif, SimHei, SimSun; background-color: #ffffff;"><p style="outline: 0px; padding: 0px; font-family: &quot;Microsoft YaHei&quot;, &quot;SF Pro Display&quot;, Roboto, Noto, Arial, &quot;PingFang SC&quot;, sans-serif; box-sizing: border-box; font-size: 16px; color: #4d4d4d; line-height: 26px; margin: 0px 0px 16px; overflow-x: auto; word-wrap: break-word;">魔兽是游戏数据传输时基于<span style="outline: 0px; margin: 0px; padding: 0px; box-sizing: border-box; word-wrap: break-word; font-family: Arial;">TCP</span><span style="outline: 0px; margin: 0px; padding: 0px; box-sizing: border-box; word-wrap: break-word; font-family: 宋体;">连接，此时主机作为</span><span style="outline: 0px; margin: 0px; padding: 0px; box-sizing: border-box; word-wrap: break-word; font-family: Arial;">TCP</span><span style="outline: 0px; margin: 0px; padding: 0px; box-sizing: border-box; word-wrap: break-word; font-family: 宋体;">的服务端，非主机是客户端。但是没办法在</span><span style="outline: 0px; margin: 0px; padding: 0px; box-sizing: border-box; word-wrap: break-word; font-family: Arial;">Internet</span><span style="outline: 0px; margin: 0px; padding: 0px; box-sizing: border-box; word-wrap: break-word; font-family: 宋体;">上实现两个非服务器主机之间的直接</span><span style="outline: 0px; margin: 0px; padding: 0px; box-sizing: border-box; word-wrap: break-word; font-family: Arial;">TCP</span><span style="outline: 0px; margin: 0px; padding: 0px; box-sizing: border-box; word-wrap: break-word; font-family: 宋体;">连接（这个可以看</span><span style="outline: 0px; margin: 0px; padding: 0px; box-sizing: border-box; word-wrap: break-word; font-family: Arial;">P2P</span><span style="outline: 0px; margin: 0px; padding: 0px; box-sizing: border-box; word-wrap: break-word; font-family: 宋体;">的实现原理）。那对战平台是怎么实现在</span><span style="outline: 0px; margin: 0px; padding: 0px; box-sizing: border-box; word-wrap: break-word; font-family: Arial;">Internet</span><span style="outline: 0px; margin: 0px; padding: 0px; box-sizing: border-box; word-wrap: break-word; font-family: 宋体;">上通过</span><span style="outline: 0px; margin: 0px; padding: 0px; box-sizing: border-box; word-wrap: break-word; font-family: Arial;">War3</span><span style="outline: 0px; margin: 0px; padding: 0px; box-sizing: border-box; word-wrap: break-word; font-family: 宋体;">的局域网模式连接对战的呢？</span></p><p style="outline: 0px; padding: 0px; font-family: &quot;Microsoft YaHei&quot;, &quot;SF Pro Display&quot;, Roboto, Noto, Arial, &quot;PingFang SC&quot;, sans-serif; box-sizing: border-box; font-size: 16px; color: #4d4d4d; line-height: 26px; margin: 0px 0px 16px; overflow-x: auto; word-wrap: break-word;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="outline: 0px; margin: 0px; padding: 0px; box-sizing: border-box; word-wrap: break-word; font-family: 宋体;">简单来说是如果</span><span style="outline: 0px; margin: 0px; padding: 0px; box-sizing: border-box; word-wrap: break-word; font-family: Arial;">A</span><span style="outline: 0px; margin: 0px; padding: 0px; box-sizing: border-box; word-wrap: break-word; font-family: 宋体;">建了一个主机，</span><span style="outline: 0px; margin: 0px; padding: 0px; box-sizing: border-box; word-wrap: break-word; font-family: Arial;">B</span><span style="outline: 0px; margin: 0px; padding: 0px; box-sizing: border-box; word-wrap: break-word; font-family: 宋体;">要进</span><span style="outline: 0px; margin: 0px; padding: 0px; box-sizing: border-box; word-wrap: break-word; font-family: Arial;">A</span><span style="outline: 0px; margin: 0px; padding: 0px; box-sizing: border-box; word-wrap: break-word; font-family: 宋体;">的主机，</span><span style="outline: 0px; margin: 0px; padding: 0px; box-sizing: border-box; word-wrap: break-word; font-family: Arial;">A</span><span style="outline: 0px; margin: 0px; padding: 0px; box-sizing: border-box; word-wrap: break-word; font-family: 宋体;">通过平台转发过来的消息知道</span><span style="outline: 0px; margin: 0px; padding: 0px; box-sizing: border-box; word-wrap: break-word; font-family: Arial;">B</span><span style="outline: 0px; margin: 0px; padding: 0px; box-sizing: border-box; word-wrap: break-word; font-family: 宋体;">要连接主机，就在自己本地创建一个</span><span style="outline: 0px; margin: 0px; padding: 0px; box-sizing: border-box; word-wrap: break-word; font-family: Arial;">TCP</span><span style="outline: 0px; margin: 0px; padding: 0px; box-sizing: border-box; word-wrap: break-word; font-family: 宋体;">的客户端，让这个客户端与</span><span style="outline: 0px; margin: 0px; padding: 0px; box-sizing: border-box; word-wrap: break-word; font-family: Arial;">war</span><span style="outline: 0px; margin: 0px; padding: 0px; box-sizing: border-box; word-wrap: break-word; font-family: 宋体;">进程的服务端连接，在魔兽中就相当于有玩家</span><span style="outline: 0px; margin: 0px; padding: 0px; box-sizing: border-box; word-wrap: break-word; font-family: Arial;">B</span><span style="outline: 0px; margin: 0px; padding: 0px; box-sizing: border-box; word-wrap: break-word; font-family: 宋体;">连接进</span><span style="outline: 0px; margin: 0px; padding: 0px; box-sizing: border-box; word-wrap: break-word; font-family: Arial;">A</span><span style="outline: 0px; margin: 0px; padding: 0px; box-sizing: border-box; word-wrap: break-word; font-family: 宋体;">主机建立的游戏，同时</span><span style="outline: 0px; margin: 0px; padding: 0px; box-sizing: border-box; word-wrap: break-word; font-family: Arial;">B</span><span style="outline: 0px; margin: 0px; padding: 0px; box-sizing: border-box; word-wrap: break-word; font-family: 宋体;">主机在自己本地创建一个</span><span style="outline: 0px; margin: 0px; padding: 0px; box-sizing: border-box; word-wrap: break-word; font-family: Arial;">TCP</span><span style="outline: 0px; margin: 0px; padding: 0px; box-sizing: border-box; word-wrap: break-word; font-family: 宋体;">服务端，让</span><span style="outline: 0px; margin: 0px; padding: 0px; box-sizing: border-box; word-wrap: break-word; font-family: Arial;">War</span><span style="outline: 0px; margin: 0px; padding: 0px; box-sizing: border-box; word-wrap: break-word; font-family: 宋体;">进程的</span><span style="outline: 0px; margin: 0px; padding: 0px; box-sizing: border-box; word-wrap: break-word; font-family: Arial;">TCP</span><span style="outline: 0px; margin: 0px; padding: 0px; box-sizing: border-box; word-wrap: break-word; font-family: 宋体;">客户端连接到自己本地的服务端。既然都是在本地建立的</span><span style="outline: 0px; margin: 0px; padding: 0px; box-sizing: border-box; word-wrap: break-word; font-family: Arial;">TCP</span><span style="outline: 0px; margin: 0px; padding: 0px; box-sizing: border-box; word-wrap: break-word; font-family: 宋体;">连接，那么怎么实现主机和非主机的游戏数据交换的呢？？</span></p><p style="outline: 0px; padding: 0px; font-family: &quot;Microsoft YaHei&quot;, &quot;SF Pro Display&quot;, Roboto, Noto, Arial, &quot;PingFang SC&quot;, sans-serif; box-sizing: border-box; font-size: 16px; color: #4d4d4d; line-height: 26px; margin: 0px 0px 16px; overflow-x: auto; word-wrap: break-word;">&nbsp;<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAeYAAAFgCAIAAADhGE1dAAAZVElEQVR4nO3doX7cOBfGYcPCgYGFC+cSChfuJfQSApflEgoXBu4lLAzsJRQGBi4MnA/Mb+ezLEuWPLLmPTr/B00nlufIOn7tuE06XQAARkyPLgAAUIrIBgAziGwAMIPIBgAziGwAMIPIBgAziGwAMIPIBgAziGwAMOOuyD6fzxMAYJrO53OrXM64K7KniZt0ALhceuUhkQ0ADRDZAGAGkQ0AZhDZAGAGkQ0AZhDZAGAGkb3TZlUlZS+2mf9xdfjt32bOX8/fBDA2Inu/fGGL/E0Fayqm4zRfDM/EPYBRjRDZizjL/7FqV6mvpqTKnhezOrt79pnaM4DxjBDZ8Tb74iwTiFWFxZmbieyqAohswDkiu9mHZr56f2SvXgYy9+MAhjR+ZM/jchFt8+yr/cT8ZqsftFpnKqY377IBODRIZF+iWEz98RImdbzz/B1rfG+7up/Fm5m77NQtc7zn+R83CwAwJC+Rndly94emtpkXUF5M5vXtndTlB4ATo0V2Krgva//SrkNkL7bcHdnxPsvrBDAML5FdGKBVH5rf5ujI5sEI4NA4kR1vuZmGD4zszIvMzrnLBpzzEtmX9F/xrW6wuvMS8adn3ozvnasmWDUWwACGimwpqfSfvzl/UX4ZKNkSwJCIbAAwg8gGADOIbAAwg8gGADOIbAAwg8gGADOIbAAwg8gGADOIbAAwg8gGADOI7Grn83nrF40Adzmfz49uc4iaiOxaavVgPPQYUojsamr1YDz0GFKI7Gpq9WA89BhSiOxqavVgPPQYUojsamr1YDz0GFKI7Gpq9WA89BhSiOxqavVgPPQYUojsamr1YDz0GFKI7Gpq9WA89BhSiOxqavVgPPQYUojsamr1YDwWe8zzL3Lo+QsGJiK7Vkk9q+u6usFth7XbY2AWl9hiza30nDuRXa0wslMv4ter22TGqh0QNGdxiS3W3AqRHQ4Wa4WqeuKNM++URHZtAbDI4hJbrLkVIjscLNYKzSM79aVUZC+2ie/T4wcs8WapUeVTw3EsLoTFmlshssPBYq3QP7IviTyNN1hstvp6cxQezuJyWKy5FSI7HCzWCodGdj5D40SO76ZTnxXfYqdG4eFSK/L+/t63kAqeu4jIDgeLtUK3u+zNzUp2HodyVUl4iHhFXl9fv379+vLy8ohyinjuIiI7HCzWCs0jOxPBq+8T2cObr8g1rK/fEhHZmojscLBYK9wZ2Zd0gGYiu+Sp9Ooe8pHNgxFN1xWZhzWRrYzIDgeLtUJ5PZtPpVcfTKc+cXWDxSPp1T2svrM5Cg80TdMirE149GF7mJ5z7/NZTiMb2Geapvf39+/fvy8y0fpd9mbQz9+cwluK1IUhHrIopsMJS2SHg8UiUq0ejOfWY4vgHiCyUy/i16vblAy585Z/x1giOxwsFpFq9WA8ix67Bbf1yM5snHknFdnlQ6oQ2RciG6iy2mPv7+9vb2/daynVPLJTXyrJ5fyd+GIPi3d23KQT2eFgsYhUqwfjsdhjmpGdesASPxy/5w6dyA4Hi7WvWj0Yj8UeOzSy44TdHBK/jveT2qx8IruH7EZkV1OrB+Ox2GPd7rJrh5Q8+85vtonIDgeLta9aPRiPxR5rHtmbGVo4hMje8yl3DRZrX7V6MB6LPXZnZF8SAZrfc8mQTI5nNrt/Ogchsqup1YPxWOyx8prjp9KZL2U2Lhmy+GrqS/Hrwrncdlu1/T2I7Gpq9WA8FnvMYs2tENnhYLFWUKsH47HYYxZrboXIDgeLtYJaPRiPxR6zWHMrRHY4WKwV1OrBeCz2mMWaWyGyw8FiraBWD8Zjsccs1twKkR0OFmsFtXowHos9ZrHmVojscLBYK6jVg/FY7DGLNbdCZIeDxVpBrR6Mx2KPWay5FSI7HCzWCmr1YDwWe8xiza0Q2eFgsVZQqwfjsdhjFmtuhcgOB4u1glo9GI/FHrNYcytEdjhYrBXU6sF4LPaYxZpbIbLDwWKtoFYPxmOxxyzW3AqRHQ4WawW1ejAeiz1mseZWiOxwsFgrqNWD8VjsMYs1t0Jkh4PFWkGtHozHYo9ZrLkVIjscLNYKavVgPMo99vn5ufq+cs1HI7LDwWKtoFYPxqPcY6+vr9++fXt7e1u8r1zz0YjscLBYK6jVg/Eo99jr6+v1v9paBLdyzUcjssPBYq2gVg/Go9xjt8heBLdyzUcjssPBYq2gVg/Gc41CTb/99tsU+fbtm+fzgsgOB4u1glo9GM80TW+q/vzzz0Vef/369Xrr/ejD9jBEdjhYrBXU6sF4lHts/mDkGtbX95VrPhqRHQ4WawW1ejAe5R67RvY8rK+Uaz4akR0OFmsFtXowHuUe++effxZhfaVc89GI7HCwWCuo1YPxWOwxizW3QmSHg8VaQa0ejMdij1msuRUiOxws1gpq9WA8FnvMYs2tENnhYLFWUKsH47HYYxZrboXIDgeLtYJaPRiPxR6zWHMrRHY4WKwV1OrBeCz2mMWaS/z777+b2xDZ4WCxVjidTvEP7AINnU6nR7d5Nc/nRc/1mohs6zg+GZ+fn+fzOfUrniFIqp9//PgxTdOPHz8eXcj/EdnmcXwyBE855On08+fn59PT0zRNT09POld9Its8jk+K5imHPJ1+vl7vr3Su+kS2eS8vL48uQZTmKYc8kfP9dr2/0rnqE9kYk+wphzyR831+vZe66hPZGJPsKYc8hfN9cb2XuuoT2ebxYCSmfMohT+F8//Xr18t/pmm6vf7169ejSyOy7eP4xJRPOeSp9bPPeojsA3F88jg+tqitl8967voMzz9VBQBzfX7SUusyNRieZedNYndJyFNbL7V6+vA4Z4jgkmaLWkSq1dOHxzkD2EEtItXq6cPjnLvhLhIjUYtItXr68Djnbny2VDkuabao9bNaPX14nHM3PluqHMfHFrX1UqunD49z7sZnS5Xj+Niitl5q9fThcc7d8I1/ns9Tzi619VKrpw+Pc4YILmm2qEWkWj19eJwzgB3UIlKtnj48zrkb7iIxErWIVKunD49z7sZnS5XjkmaLWj+r1dOHxzl347OlynF8bFFbL7V6+vA45258tlQ5jo8tauulVk8fHufcDd/45/k85exSWy+1evrwOGeI4JJmi1pEqtXTh8c5A9hBLSLV6unD45y74S4SI1GLSLV6+vA45258tlQ5Lmm2qPWzWj19eJxzNz5bqhzHxxa19VKrpw+Pc+7GZ0uV4/jYorZeavX04XHO3fCNf57PU84utfVSq6cPj3OGCC5ptqhFpFo9fXicM4Ad1CJSrZ4+PM65G+4iMRK1iFSrpw+Pc+7GZ0uV45Jmi1o/q9XTh8c5d+OzpcpxfGxRWy+1evrwOOdufLZUOY6PLWrrpVZPHx7n3A3f+Of5POXsUlsvtXr68DhniOCSZotaRKrV04fHOTdxPp8naDifz49uh0PQYzp0eozI3mkquMJzF9lHyVpYpDYvz/XozF2lDnNKllBnmTW1uqSNepzV5uW5Hp25q9RhDpF9v1bHZ9TjrDYvz/XozF2lDnOI7PsR2Xlq8/Jcj87cVeowh2fZ9yOy89Tm5bkenbmr1GGOzhLaxbPsPLV5ea5HZ+4qdZijs4QYdS3U5uW5Hp25q9RhDg9GdOicTm2pzctzPTpzV6nDnM0lvP4L/NuLVakdZjbr4PaJixepSuab5ed4iabZtuDBPHZeCm3Qp39K6PSYSh3mlCzhosVX/7i6w0f15eJD8wUvNl7dgMi+x8PntWiD8shOfWn1nfLILmzIIzx8LW5U6jCnYWTH9yOFd9mbtzOLfa4OKZxjyXm1ea6matisJE/ndGprc17xoUsd21RjVLXBZjemyt7RBvGbcTf2XHedHlOpw5ySJbw+yy45i/Y1RHySpPa5OBnyE8kUHJ9FJZulPqvVaaBzOrVVMq/V5Vv9Uu1aPLwNpuwJEu/2UDo9plKHOfuWMN+dmROgdre7z+T5+6tDSva8us/NU3c3ndOprZJ5lS/0JbuOgm2w2M/qpWJ14BF0ekylDnNKYnRfa162zo2SYjKjSqqanySZ2jY3Xt0mIzfJNJ3Tqa3mkZ35akkblC9xyTb5NigJZSIbFWpPp0w8rfZrVZBlztvNjTfP+cXJs7p9/lSMd5KvsJbO6dTWnUu/Ojz11ZI2mHfj0W1QspOe667TYyp1mFN+OsW9lWnTeIMjIntxDpTsMz7ZLunTuHCC/PRj3tGRXdsGi9BcvL+7DTIWWxLZFyJ7t9rTqaRNM3cWtcWUZ3FJGZfwbEntsPBc3T3NTMG7xyo7OrI395xapm5tkG/Fnuuu02MqdZiz43RKNVncr/PN7jxv43dqd1h+Bl4S51iqqqqSCqsdSfPIvqev8nl9uaMNMh+3mAuRfSGyd9vd8ZnNUu2+2Z2pK8Hm6819rp4zmS0LM/qydqHaTed0aqtqpfKvN/+Y3/kiJdu2wXzPq/u8zLplc8hBdHpMpQ5zNpcw08FV+yz5oEzHL75UnpLzzfKJv+9cvbQ763ROp7bK55VZ6NUVt9IGi4+OJ7hZfys6PaZShzmFkX1J3zWvnkg7Pqi5xVm6enLeTqHFuVQ7wSYnns7p1NZj5xW3QSpqj2uDVGSv7vZQOj2mUoc5JUvIb/LrQ+d0akttXp7r0Zm7Sh3mlCyhzjJr4h/55anNy3M9OnNXqcMcIvt+rY7PqMdZbV6e69GZu0od5hDZ9yOy89Tm5bkenbmr1GEOz7LvR2Tnqc3Lcz06c1epwxydJbSLZ9l5avPyXI/O3FXqMEdnCTHqWqjNy3M9OnNXqcOcwgcjq/8E9ZiK/Br1kKrNy3M9OnNXqcOcwr9+XP0hAp3lfywejOSpzctzPTpzV6nDnM0ljH/6az5EpwMeiL9+zFObl+d6dOauUoc5tf/Ir/yHdP0gsvPU5uW5Hp25q9RhTlVk3+6yF/fdzhHZeWrz8lyPztxV6jCn5MFIyWae8Sw7T21enuvRmbtKHebUPsuOH2rrNIF1ox5JtXl5rkdn7ip1mFP7j/zisNZpAutGPZJq8/Jcj87cVeowp/avHxHjwUie2rw816Mzd5U6zCGy78dfP+apzctzPTpzV6nDHCL7fkR2ntq8PNejM3eVOswpfJZ9fCGGEdl5avPyXI/O3FXqMEdnCe3iWXae2rw816Mzd5U6zDmdTql/xofOTqfTo9vhEPSYDp0eI7IPxIMRjGSSudO8UqunD49z7sZnS5XjkmaLWj+r1dOHxzl347OlynF8bFFbL7V6+vA45258tlQ5jo8tauulVk8fHufcDd/45/k85exSWy+1evrwOGeI4JJmi1pEqtXTh8c5A9hBLSLV6unD45y74S4SI1GLSLV6+vA45258tlQ5Lmm2qPWzWj19eJxzNz5bqhzHxxa19VKrpw+Pc+7GZ0uV4/jYorZeavX04XHO3fCNf57PU84utfVSq6cPj3OGCC5ptqhFpFo9fXicM4Ad1CJSrZ4+PM65G+4iMRK1iFSrpw+Pc+7GZ0uV45Jmi1o/q9XTh8c5d+OzpcpxfGxRWy+1evrwOOdufLZUOY6PLWrrpVZPHx7n3A3f+Of5POXsUlsvtXr68DhniOCSZotaRKrV04fHOQPYQS0i1erpw+Ocu+EuEiNRi0i1evrwOOdufLZUOS5ptqj1s1o9fXicczc+W6ocx8cWtfVSq6cPj3PuxmdLleP42KK2Xmr19OFxzt3wjX+ez1POLrX1UqunD49zhgguabaoRaRaPX14nDOAHdQiUq2ePjzOuRvuIjEStYhUq6cPj3PuxmdLleOSZotaP6vV08ddcz6fzxMAYJrO53OrXM64K7Inl1e5chyfPI6PLWrr5bMeIruxnz9/vvxnmqbb658/fz66NDn0jy1q6+WzHiK7sY+Pjy9fviy+Y/ry5cvHx8ejS5PDs2xb1M53n/UQ2e09Pz8vIvv5+fnRRQH3UjvffdZDZLe3uNHmFhtjUDvffdZDZB9ifqPNLXYKD0ZsUTvffdZDZB/idqPNLXYG/WOL2nr5rIfIPsr1Rptb7Az6xxa19fJZD5F9lI+Pj9PpxC12Bv1ji9p6+axnqMjmpzFxtD4/4aZpEjvffdYzVGSr1YPxeO4xtbn7rIfIBip47jG1ufush8gGKnjrMeVfwKC2FkR2NbV6MB5vPab8CxjU1oLIrqZWD8bjsMdkfwGD2loQ2dXU6sF4HPaY7C9gUFsLIruaWj0Yj88e0/wFDGprQWRXU6sH4/HZY5q/gEFtLYjsamr1YDxue0zwFzCorQWRXU2tHozHbY8J/gIGtbUgsqup1YPxWOwxz7/IoecvGJiI7Fol9ayu6+oGtx3mt18dsihG7UBhN4tLabHmVnrOnciuVhjZqRfx69VtSoasJns5tQOLG4tLY7HmVojscLBYK1TVs3qznHonFdnlQ6qoHVjcWFwaizW3QmSHg8VaoXlkp75Uksv5O/HFHhbv3HmTjuNYXBeLNbdCZIeDxVpBM7JTD1jih+NN7tBxKItLY7HmVojscLBYKxwa2XHCbg6JX8f7SW1WPhH0lFqaz8/PzpWU89xORHY4WKwVut1l1w4pefad3wwi4qV5f3///v379+/fH1JPCc/tRGSHg8VaoXlkb2Zo4RAiexjzpbmG9fUbJiJbE5EdDhZrhTsj+5II0PyeS4ZkcjyzmdrhxeW/RZmHNZGtjMgOB4u1Qnk98VPpzJcyG5cMWXw19aX4deFc0NM1nafI09PTN1Wee4nIDgeLtYJaPRjPNE1vb2/XHJz7/fff31SVnBfxRWgxanFLsTokv/1DENnhYLGIVKsH47n12FsY3NYfjEyz7wLjUVP0HeTqnlNjieyWn3LXYLGIVKsH41n02C24rUd2ZuPMOyWRXVtAW0R2OFgsItXqwXhWe+zt7e2vv/7qX0yh5pGd+lIqshfbxPfp8QOWeLPUqNrpHIfIrqZWD8Zjscf6R/YlkafxBovNVl9vjsogssPBYu2rVg/GY7HHDo3sfIbGiRzfTac+K77FTo2qms5xiOxqavVgPBZ7rNtd9uZmJTuPQ7mqpN1b3o/IrqZWD8ZjsceaR3YmglffJ7Jbfspdg8XaV60ejMdij90Z2Zd0gGYiu+Sp9Ooe8pHNgxEiG6hgsceqAi7/VHr1wXTqE1c3WDySXt3D6jubo1IzKtmsCSK7mlo9GI/FHrNYcytEdjhYrBXU6sF4LPaYxZpbIbLDwWKtoFYPxmOxxyzW3AqRHQ4WawW1ejAeiz1mseZWiOxwsFgrqNWD8VjsMYs1t0Jkh4PFWkGtHozHYo9ZrLkVIjscLNYKavVgPBZ7zGLNrRDZ4WCxVlCrB+Ox2GMWa26FyA4Hi7WCWj0Yj8Ues1hzK0R2OFisFdTqwXgs9pjFmlshssPBYq2gVg/GY7HHLNbcCpEdDhZrBbV6MB6LPWax5laI7HCwWCuo1YPxWOwxizW3QmSHg8VaQa0ejMdij1msuRUiOxws1gpq9WA8FnvMYs2tENnhYLFWUKsH47HYYxZrboXIDgeLtYJaPRiPxR6zWHMrRHY4WKwV1OrBeJR77O+//35+fv74+Fi8r1zz0YjscLBYK6jVg/Eo99jr6+s0TV++fFkEt3LNRyOyw8FiraBWD8aj3GPXyL6aB7dyzUcjssPBYq2gVg/GM03Ti6o//vhjCl2D2/N5QWSHg8VaQa0ejIfItoXIDgeLtYJaPRiPco/xYCRGZIeDxVpBrR6MR7nH+OvHGJEdDhZrBbV6MB7lHuMf+cWI7HCwWCuo1YPxWOwxizW3QmSHg8VaQa0ejMdij1msuRUiOxws1gpq9WA8FnvMYs2tENnhYLFWUKsH47HYYxZrboXIDgeLtYJaPRiPxR6zWHMrRHY4WKwV1OrBeCz2mMWaWyGyw8FirXA6nSbgSKfT6dFtXs3zedFzvSYiGwCsILIBwAwiGwDMILIBwAwiGwDMILIBwAwiGwDMILIBwAwiGwDMILIBwAwiGwDMILIBwAwiGwDMILIBwAwiGwDMILIBwAwiGwDMILIBwAwie495SZvl3b9BvM1mAbf/4mj+ev4mAIuI7D2qIntzm8XeUsGa+tA4zRfDM3EPwJYRInsRUvk/Vu1q9UtxIMbvxze2mfvc1XhNRfY9+0ztGYAVI0R2vM2+kMrE3O4t89vEmZuJ7KoCiGxgSET2ng9tFdmZve0uYPUykLkfB2DI+JE9D8FFYM0TreoTG0b2aknxkNRmqZ2Ty8CQBonsSxR2qT9ewqSOd565D129UU3dvcb3tvnNVmcRTzCz22nt4rRZAABDvER2ZssdHzpt3eQW7m1eannZmwXM87qqTgDiRovsVHBf1m6HpSJ7seXuyI73WV4nAHFeIrswFgs/tFVkV9W2O7J5MAIMY5zIjrfczLiqyE6lXkka3hPZmReZnXOXDQzJS2Rf0n9xt7pB+QdthnvJ52Z2O6096d5EZANDGiqyu8lH9o69rV4n5m/OX5RfBkq2BGAIkQ0AZhDZAGAGkQ0AZhDZAGAGkQ0AZhDZAGAGkQ0AZhDZAGAGkQ0AZhiI7NPptPnD3wDgwel0apXLGdwmA4AZRDYAmEFkA4AZRDYAmEFkA4AZRDYAmEFkA4AZRDYAmEFkA4AZRDYAmEFkA4AZRDYAmEFkA4AZRDYAmEFkA4AZRDYAmEFkA4AZRDYAmEFkA4AZ/wPV0vgSjkbVBAAAAABJRU5ErkJggg==" alt="" style="outline: 0px; margin: 0px; padding: 0px; box-sizing: border-box; word-wrap: break-word; cursor: zoom-in; max-width: 100%;" /></p><p style="outline: 0px; padding: 0px; font-family: &quot;Microsoft YaHei&quot;, &quot;SF Pro Display&quot;, Roboto, Noto, Arial, &quot;PingFang SC&quot;, sans-serif; box-sizing: border-box; font-size: 16px; color: #4d4d4d; line-height: 26px; margin: 0px 0px 16px; overflow-x: auto; word-wrap: break-word;">&nbsp;</p><p style="outline: 0px; padding: 0px; font-family: &quot;Microsoft YaHei&quot;, &quot;SF Pro Display&quot;, Roboto, Noto, Arial, &quot;PingFang SC&quot;, sans-serif; box-sizing: border-box; font-size: 16px; color: #4d4d4d; line-height: 26px; margin: 0px 0px 16px; overflow-x: auto; word-wrap: break-word;">&nbsp;&nbsp;<span style="outline: 0px; margin: 0px; padding: 0px; box-sizing: border-box; word-wrap: break-word; font-family: 宋体;">从上面的图可以看出，</span><span style="outline: 0px; margin: 0px; padding: 0px; box-sizing: border-box; word-wrap: break-word; font-family: Arial;">War3</span><span style="outline: 0px; margin: 0px; padding: 0px; box-sizing: border-box; word-wrap: break-word; font-family: 宋体;">主机和非主机的数据交换，其实是在两个本地模拟创建的</span><span style="outline: 0px; margin: 0px; padding: 0px; box-sizing: border-box; word-wrap: break-word; font-family: Arial;">TCPsever</span><span style="outline: 0px; margin: 0px; padding: 0px; box-sizing: border-box; word-wrap: break-word; font-family: 宋体;">和</span><span style="outline: 0px; margin: 0px; padding: 0px; box-sizing: border-box; word-wrap: break-word; font-family: Arial;">TCPClient</span><span style="outline: 0px; margin: 0px; padding: 0px; box-sizing: border-box; word-wrap: break-word; font-family: 宋体;">之间进行的，当主机有数据要发给非主机，先会将数据发给主机本地的</span><span style="outline: 0px; margin: 0px; padding: 0px; box-sizing: border-box; word-wrap: break-word; font-family: Arial;">TCPClient</span><span style="outline: 0px; margin: 0px; padding: 0px; box-sizing: border-box; word-wrap: break-word; font-family: 宋体;">，然后对战平台会从</span><span style="outline: 0px; margin: 0px; padding: 0px; box-sizing: border-box; word-wrap: break-word; font-family: Arial;">TCPClient</span><span style="outline: 0px; margin: 0px; padding: 0px; box-sizing: border-box; word-wrap: break-word; font-family: 宋体;">数据缓冲池中取出数据，通过</span><span style="outline: 0px; margin: 0px; padding: 0px; box-sizing: border-box; word-wrap: break-word; font-family: Arial;">UDP</span><span style="outline: 0px; margin: 0px; padding: 0px; box-sizing: border-box; word-wrap: break-word; font-family: 宋体;">的方式，发给非主机，非主机会将</span><span style="outline: 0px; margin: 0px; padding: 0px; box-sizing: border-box; word-wrap: break-word; font-family: Arial;">UDP</span><span style="outline: 0px; margin: 0px; padding: 0px; box-sizing: border-box; word-wrap: break-word; font-family: 宋体;">数据放入</span><span style="outline: 0px; margin: 0px; padding: 0px; box-sizing: border-box; word-wrap: break-word; font-family: Arial;">TCPServer</span><span style="outline: 0px; margin: 0px; padding: 0px; box-sizing: border-box; word-wrap: break-word; font-family: 宋体;">的发送数据缓冲池，由它发给魔兽进程中的</span><span style="outline: 0px; margin: 0px; padding: 0px; box-sizing: border-box; word-wrap: break-word; font-family: Arial;">TCPClient</span><span style="outline: 0px; margin: 0px; padding: 0px; box-sizing: border-box; word-wrap: break-word; font-family: 宋体;">，反过来一样，这样就实现了魔兽数据的完成传输，</span><span style="outline: 0px; margin: 0px; padding: 0px; box-sizing: border-box; word-wrap: break-word; font-family: Arial;">Internet</span><span style="outline: 0px; margin: 0px; padding: 0px; box-sizing: border-box; word-wrap: break-word; font-family: 宋体;">上的联网对战也就实现了。</span></p><p style="outline: 0px; padding: 0px; font-family: &quot;Microsoft YaHei&quot;, &quot;SF Pro Display&quot;, Roboto, Noto, Arial, &quot;PingFang SC&quot;, sans-serif; box-sizing: border-box; font-size: 16px; color: #4d4d4d; line-height: 26px; margin: 0px 0px 16px; overflow-x: auto; word-wrap: break-word;">&nbsp;</p><p style="outline: 0px; padding: 0px; font-family: &quot;Microsoft YaHei&quot;, &quot;SF Pro Display&quot;, Roboto, Noto, Arial, &quot;PingFang SC&quot;, sans-serif; box-sizing: border-box; font-size: 16px; color: #4d4d4d; line-height: 26px; margin: 0px 0px 16px; overflow-x: auto; word-wrap: break-word;">&nbsp;&nbsp;&nbsp;<span style="outline: 0px; margin: 0px; padding: 0px; box-sizing: border-box; word-wrap: break-word; font-family: 宋体;">另外说一下</span><span style="outline: 0px; margin: 0px; padding: 0px; box-sizing: border-box; word-wrap: break-word; font-family: Arial;">T</span><span style="outline: 0px; margin: 0px; padding: 0px; box-sizing: border-box; word-wrap: break-word; font-family: 宋体;">人挂的原理，为什么主机可以</span><span style="outline: 0px; margin: 0px; padding: 0px; box-sizing: border-box; word-wrap: break-word; font-family: Arial;">T</span><span style="outline: 0px; margin: 0px; padding: 0px; box-sizing: border-box; word-wrap: break-word; font-family: 宋体;">人呢？为什么主机只是关闭本机的</span><span style="outline: 0px; margin: 0px; padding: 0px; box-sizing: border-box; word-wrap: break-word; font-family: Arial;">TCP</span><span style="outline: 0px; margin: 0px; padding: 0px; box-sizing: border-box; word-wrap: break-word; font-family: 宋体;">连接就可以把远程的非主机玩家</span><span style="outline: 0px; margin: 0px; padding: 0px; box-sizing: border-box; word-wrap: break-word; font-family: Arial;">T</span><span style="outline: 0px; margin: 0px; padding: 0px; box-sizing: border-box; word-wrap: break-word; font-family: 宋体;">出游戏呢？从上图我们应该可以获得答案。如果主机关闭了本地用来接受远程非主机传输的</span><span style="outline: 0px; margin: 0px; padding: 0px; box-sizing: border-box; word-wrap: break-word; font-family: Arial;">UDP</span><span style="outline: 0px; margin: 0px; padding: 0px; box-sizing: border-box; word-wrap: break-word; font-family: 宋体;">信息的那个</span><span style="outline: 0px; margin: 0px; padding: 0px; box-sizing: border-box; word-wrap: break-word; font-family: Arial;">TCPClient</span><span style="outline: 0px; margin: 0px; padding: 0px; box-sizing: border-box; word-wrap: break-word; font-family: 宋体;">，那么很显然，主机将不能获得这个非主机信息，远程的那个非主机也不能收到主机转发的游戏数据包了，这个时候这个非主机</span><span style="outline: 0px; margin: 0px; padding: 0px; box-sizing: border-box; word-wrap: break-word; font-family: Arial;">War3</span><span style="outline: 0px; margin: 0px; padding: 0px; box-sizing: border-box; word-wrap: break-word; font-family: 宋体;">进程理所当然的认为自己与主机失去了连接，</span><span style="outline: 0px; margin: 0px; padding: 0px; box-sizing: border-box; word-wrap: break-word; font-family: Arial;">T</span><span style="outline: 0px; margin: 0px; padding: 0px; box-sizing: border-box; word-wrap: break-word; font-family: 宋体;">人挂的目的也达到了。</span></p></div><img src ="http://www.cppblog.com/markqian86/aggbug/216983.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/markqian86/" target="_blank">长戟十三千</a> 2019-11-19 17:16 <a href="http://www.cppblog.com/markqian86/archive/2019/11/19/216983.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>《守望先锋》架构设计与网络同步</title><link>http://www.cppblog.com/markqian86/archive/2018/06/12/215721.html</link><dc:creator>长戟十三千</dc:creator><author>长戟十三千</author><pubDate>Tue, 12 Jun 2018 08:52:00 GMT</pubDate><guid>http://www.cppblog.com/markqian86/archive/2018/06/12/215721.html</guid><wfw:comment>http://www.cppblog.com/markqian86/comments/215721.html</wfw:comment><comments>http://www.cppblog.com/markqian86/archive/2018/06/12/215721.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/markqian86/comments/commentRss/215721.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/markqian86/services/trackbacks/215721.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 《守望先锋》架构设计与网络同步Overwatch Gameplay Architecture and NetcodeTimothy FordLead Gameplay EngineerBlizzard Entertainment翻译：kevinan&nbsp;在GDC2017【Overwatch Gameplay Architecture andNetcode&nbsp;】的分享会上，来自暴雪的T...&nbsp;&nbsp;<a href='http://www.cppblog.com/markqian86/archive/2018/06/12/215721.html'>阅读全文</a><img src ="http://www.cppblog.com/markqian86/aggbug/215721.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/markqian86/" target="_blank">长戟十三千</a> 2018-06-12 16:52 <a href="http://www.cppblog.com/markqian86/archive/2018/06/12/215721.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>游戏服务器架构</title><link>http://www.cppblog.com/markqian86/archive/2018/05/01/215609.html</link><dc:creator>长戟十三千</dc:creator><author>长戟十三千</author><pubDate>Tue, 01 May 2018 08:50:00 GMT</pubDate><guid>http://www.cppblog.com/markqian86/archive/2018/05/01/215609.html</guid><wfw:comment>http://www.cppblog.com/markqian86/comments/215609.html</wfw:comment><comments>http://www.cppblog.com/markqian86/archive/2018/05/01/215609.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/markqian86/comments/commentRss/215609.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/markqian86/services/trackbacks/215609.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 一、 讨论的背景现代电子游戏，基本上都会使用一定的网络功能。从验证正版，到多人交互等等，都需要架设一些专用的服务器，以及编写在服务器上的程序。因此，游戏服务器端软件的架构，本质上也是游戏服务器这个特定领域的软件架构。软件架构的分析，可以通过不同的层面入手。比较经典的软件架构描述，包含了以下几种架构：运行时架构&#8212;&#8212;这种架构关心如何解决运行效率问题，通常以程序进程图、数据流图为...&nbsp;&nbsp;<a href='http://www.cppblog.com/markqian86/archive/2018/05/01/215609.html'>阅读全文</a><img src ="http://www.cppblog.com/markqian86/aggbug/215609.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/markqian86/" target="_blank">长戟十三千</a> 2018-05-01 16:50 <a href="http://www.cppblog.com/markqian86/archive/2018/05/01/215609.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>架构期间要做的事情</title><link>http://www.cppblog.com/markqian86/archive/2017/08/29/215207.html</link><dc:creator>长戟十三千</dc:creator><author>长戟十三千</author><pubDate>Tue, 29 Aug 2017 10:43:00 GMT</pubDate><guid>http://www.cppblog.com/markqian86/archive/2017/08/29/215207.html</guid><wfw:comment>http://www.cppblog.com/markqian86/comments/215207.html</wfw:comment><comments>http://www.cppblog.com/markqian86/archive/2017/08/29/215207.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/markqian86/comments/commentRss/215207.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/markqian86/services/trackbacks/215207.html</trackback:ping><description><![CDATA[1、代码规范定义<br />&nbsp; &nbsp;proto代码规范<br />&nbsp; &nbsp;变量、结构体、函数、命名规范<br /><br />2、架构文档<br />&nbsp; &nbsp;架构拆分<br />&nbsp;&nbsp;&nbsp;模块功能拆分<br />&nbsp; &nbsp;接口定义及调用规则<br />&nbsp; &nbsp;模块解耦设计<br />&nbsp; &nbsp;表格、数据库、协议选择<br /><br />3、架构设计<br />&nbsp; &nbsp;出生服务器<br />&nbsp; &nbsp;战斗服务器<br />&nbsp; &nbsp;其他服务器<br />&nbsp; &nbsp;服务器间均衡策略<br />&nbsp; &nbsp;服务器集群策略，启动，关闭<br /><br />4、服务器模块架构设计<br />&nbsp; &nbsp;网络模块<br />&nbsp; &nbsp;计时器<br />&nbsp; &nbsp;逻辑模块<br />&nbsp; &nbsp;数据库模块<br />&nbsp; &nbsp;模块间通信，线程间RPC<br />&nbsp; &nbsp;模块间解耦<br />&nbsp; &nbsp;LUA：加载，调用，热更，异常处理<br />&nbsp; &nbsp;so调用：加载，调用【上层模块，同级模块】，热更，异常处理<br />&nbsp; &nbsp;数据管理模块：加载，删除，更新【客户端，数据库】<br />&nbsp; &nbsp;异常处理：逻辑日志，dump, gdb反向调试，堆栈信息日志<br />&nbsp; &nbsp;协议模块：protobuf, 多个文件<br />&nbsp; &nbsp;表格模块：pb文件及热更新<br /><br />5、一些开源库<br />grpc<br />libev<br />libgo协程<br />protobuf<br />hiredis<br />mysql<br />zeromq<br />kafuka<br />zookeeper<br />git<br />jekins<br />docker<br /><br />&nbsp; &nbsp;<br />&nbsp; &nbsp;<br /><img src ="http://www.cppblog.com/markqian86/aggbug/215207.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/markqian86/" target="_blank">长戟十三千</a> 2017-08-29 18:43 <a href="http://www.cppblog.com/markqian86/archive/2017/08/29/215207.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>