这样做,有没有问题????

  

  TGateInfo = record Socket: TCustomWinSocket; sIPaddr: string; sReceiveMsg: string;UserList: TList;dwKeepAliveTick: LongWord; end;pTGateInfo = ^TGateInfo;

  上面正常的信息结构,当然里面包含了一个链表对象,呵呵。

procedure TFrmMain.GSocketClientConnect(Sender: TObject;Socket: TCustomWinSocket);
varGateInfo: pTGateInfo;Config: pTConfig;
beginConfig := @g_Config;if not ExecTimer.Enabled then beginSocket.Close;Exit;end;New(GateInfo);
  GateInfo.Socket := Socket;GateInfo.sIPaddr := GetGatePublicAddr(Config, Socket.RemoteAddress);GateInfo.sReceiveMsg := '';GateInfo.UserList := TList.Create;GateInfo.dwKeepAliveTick := GetTickCount();EnterCriticalSection(Config.GateCriticalSection);tryConfig.GateList.Add(GateInfo);finallyLeaveCriticalSection(Config.GateCriticalSection);end;
end;procedure TFrmMain.GSocketClientDisconnect(Sender: TObject;Socket: TCustomWinSocket);
varI: Integer;II: Integer;GateInfo: pTGateInfo;UserInfo: pTUserInfo;Config: pTConfig;
beginConfig := @g_Config;EnterCriticalSection(Config.GateCriticalSection);tryfor I := 0 to Config.GateList.Count - 1 do beginGateInfo := Config.GateList.Items[I];if GateInfo.Socket = Socket then beginfor II := 0 to GateInfo.UserList.Count - 1 do beginUserInfo := GateInfo.UserList.Items[II];if Config.boShowDetailMsg thenMainOutMessage('Close: ' + UserInfo.sUserIPaddr);Dispose(UserInfo);end;GateInfo.UserList.Free;Dispose(GateInfo);
        Config.GateList.Delete(I);
        Break;end;end;finallyLeaveCriticalSection(Config.GateCriticalSection);end;
end;

  上面是服务端和客户端的连接和断开客户端连接的事件。

  很正常,对吧,看出什么问题没有??????

  在高级服务器IOCP完成端口编程里面,我们也会声明两个数据结构,同样会给它们分配内存。但是有些地方不一样。

  其实很多时候,程序的漏洞就是这些貌似没有问题的代码造成的。

  换做以前,我也没有觉得有什么问题在那里。记得我曾经在前面说过,服务器编程跟一般桌面软件编程是有区别的。

  那么最大的区别,就是内存的分配上面。

  做过IOCP编程测试的很容易看出问题在那里。

  对,内存分配上面,这种分配,无论怎么说,都是错误的。

  IOCP编程需要你去管理内存池分配,这个直接关系到服务器长时间运行,性能被显著影响的问题。

  有很多人不了解引擎程序的实际质量情况,当服务器在很短时间内出现性能下滑,都归结为服务器的物理质量问题。

  却不了解这些是软件造成的,大多数时候是这样的。

  每一天,如果玩家大量地上下线,或者给你很温柔地来个机器人大量地上下线,啥都不做,就是上线和下线,那么保证你的机器在很短时间内,卡得跟蜗牛一样。

  难道使用New来分配内存,使用Dispose来释放内存不行吗,行,肯定行,不行,机器不卡B啊,对吧。

  哈哈!!!

  里面还带几个对象呢,一次这样的操作,天知道会出现什么问题。

  其实没有那么神秘,说白了,就是会产生大量的内存碎片的问题而已。

  我没有看到原来原装的源代码是什么样子的,但是我可以告诉你,这样做的人,以前或者现在都缺乏服务器编程相关的经验。

  我们经常谈被攻击的问题,其实很多时候,是你的程序打开了这扇大门而已。

  这些只是整套源代码显露出来的BUG的冰山一角而已。

  后面我们继续去发现它,当然如果把整套源代码的全局变量或者说初始化才使用的变量合并起来,我想,这块“蛋糕”真不小。呵呵。

  也许大家会问,上面的问题怎么解决,一样的,问题知道了,按照你自己的想法去做。

  还是参考IOCP的做法可能好点。  

转载于:https://www.cnblogs.com/GameDelphi/archive/2012/08/24/2654816.html

探讨【IGE】的源代码【五】。相关推荐

  1. 读Spring的源代码五:AutoWired是如何实现注入的

    下面这个图是spring容器如何实现@AutoWired自动注入的过程

  2. 探讨Vue 数据监测原理-第五节-展开介绍 Vue中监测-【数组】数据的原理

    文章目录 探讨一下Vue 数据监测的原理 本次探讨共的第五个章节 第五节:展开介绍 Vue中监测-[数组]数据的原理 1. 案例 1.1. 页面案例 2. 数组形式|对象形式爱好的区别 2.1. 页面 ...

  3. 第十六章 网络通信协议探讨

                               第十六章    网络通信协议探讨      LINUX的源代码中属于网络的就有近38万行:我必须先花时间彻底解决网络编程问题,再论其它:所以.其它 ...

  4. 《五维数字孪生模型及十个领域应用探索》

    本文为北京航空航天大学陶飞教授应邀在CIMS大会上做了题为<五维数字孪生模型及十个领域应用探索>的学术报告. 会后,陶飞教授应邀将报告内容进行了整理,带领北航数字孪生技术研究小组与国内10 ...

  5. c语言五子棋源代码vc6,五子棋源码实验报告及人机对战说明.docx

    1. 五子棋对战说明 2. 实验报告 3. 源代码 五 子 棋 作品特点:C 语言程序 五子棋 作品功能:五子棋人机对战,人人对战. 目录:1 五子棋介绍. 五子棋棋型介绍. 人人对战的实现. 电脑下 ...

  6. 详解Linux驱动技术(五) _设备阻塞/非阻塞读写

    在Linux驱动程序编写过程中,设备阻塞/非阻塞读写是一种非常重要的技术.它可以实现高效的数据传输和事件处理,提高系统的性能和响应速度.在本文中,我们将深入探讨Linux驱动技术(五) _设备阻塞/非 ...

  7. Java IO完全总结(转载) --- 重点在源码分析

    转载自https://blog.csdn.net/baobeisimple/article/details/1713797 个人认为前面对于输入输出流(超类)的 继承结构,仅仅作为参考知识了解,如果想 ...

  8. JavaScriptCore内部原理(一):从JS源码到字节码的追踪

    一.概述 事实证明,在Fuzzing Webkit的过程中,使用Fuzzilli对JavaScriptCore(JSC)进行Fuzzing会非常成功,随着时间的推移,会产生大量崩溃.但是,一旦出现崩溃 ...

  9. 北邮数电实验三接球小游戏

    文章目录 前言 一.实验要求 二.设计思路 三.设计系统框图 四.源代码 五.遇到的问题和解决办法 六.总结 前言 北邮数电实验三"接球小游戏" 数电实验验收已经结束了,实验报告也 ...

  10. 你所不知道的库存超限做法

    作者:程序诗人,来自:cnblogs.com/scy251147 零,题记 在互联网企业中,限购的做法,多种多样,有的别出心裁,有的因循守旧,但是种种做法皆想达到的目的,无外乎几种,商品卖的完,系统抗 ...

最新文章

  1. 未来几年自动驾驶预测(下)
  2. 神经网络为何成为学习算法的通用结构?
  3. 美宣布制裁中兴通讯 商务部:坚决反对并将交涉
  4. delphi之http通讯
  5. Ubantu-16.04 eclipse安装
  6. Windows Server Backup 裸机恢复
  7. OpenCASCADE:拓扑 API之偏移、拔模、管道和演变形状
  8. 【COGS1752】 BOI2007—摩基亚Mokia
  9. 使用Jmeter对mysql进行性能测试入门
  10. vue从入门到开发--4--处理http请求
  11. C#之重定向输入输出
  12. SpringMVC 刷课笔记
  13. 敏捷.高效通过ACP.随笔
  14. 计算机基础知识如何打钩,打勾的符号怎么输入电脑上(对勾符号在word和Excel的输入方法)...
  15. 由于您的系统没有安装html help,win10遇到“您未安装FLASH控件”的提示怎么办
  16. WPF设置当前激活窗体(前景窗体)
  17. Fandis COSTECH A17M23SWB MT0 AC220V 50HZ 42W
  18. linux wifi自动消失,linux没有wifi
  19. 华硕e202s安装linux系统,华硕笔记本E202S原装win10系统可以改win7吗?
  20. 零基础学Arcgis(四)|空间数据采集与管理(1)Shapefile和dBASE文件的创建与管理

热门文章

  1. echarts legend属性_Vue 项目如何使用Echarts , 手摸手带你入门
  2. java 用户行为记录_大型网站用户行为记录的一个实现
  3. php 计算签名,php – 计算Amazon Marketplace API的签名问题
  4. php图片位置偏移代码,关于PHP的fseek()方法,究竟是什么偏移(位置)?
  5. 3打开db文件_sqlite库学习(3)为什么sqlite3_open会失败
  6. python flask将读取的图片返回给web前端
  7. html中多个div分开排列,CSS+DIV设计实例:多个DIV排列时居中
  8. 密码学基础(四):OpenSSL命令详解
  9. Super Mario HDU 4417 主席树区间查询
  10. Delphi中WebBrowser(或者EmbeddedWebBrowser)控件打开部分网站报“Invalid floating point operation”异常的解决方法...