欢迎来到天天文库
浏览记录
ID:19401154
大小:28.00 KB
页数:10页
时间:2018-10-01
《浅析delphi实现iocp后的优化》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、【转】浅析Delphi实现IOCP后的优化在我的BLOG中有几篇文章是关于如何用DLEPHI来实现IOCP,详见我的BLOG《DELPHI中完成端口(IOCP)的简单分析》。在这几篇文章中介绍了如何编写一个简单的IOCP的方法。最近我重新对这些文章中的一些BUG和效率低下的部分做了修正(其实相当于重新编写),通过几个不同的途径对IOCP进行了实现。下面我就来说一下我对以前代码的优化方法。1:结构定义部分。首先我们必须定义一个IO数据结构,在我的BLOG中我当时是这样定义的。(1):单IO数据结构 LPVOID=Pointer; LPPER_IO
2、_OPERATION_DATA=^PER_IO_OPERATION_DATA; PER_IO_OPERATION_DATA=packedrecord Overlapped:OVERLAPPED; DataBuf:TWSABUF; Buffer:array[0..1024]ofCHAR; BytesSEND:DWORD; BytesRECV:DWORD; end;和一个(2):“单句柄数据结构” LPPER_HANDLE_DATA=^PER_HANDLE_DATA; PER_HANDLE_DATA=packedrecord Soc
3、ket:TSocket; end;其实为什么我们不能将他们进行合并定义成一个结构呢? //IO结构 PIOData=^TIOData; TIOData=record Overlapped:OVERLAPPED; DataBuf:TWSABUF; Socket:TSocket; //套接字 OperationType:TOperation; //操作类型 BufferLen:Integer; 5.1-9,,services,andmakethecitymorea
4、ttractive,strengtheningpublictransportinvestment,establishedasthebackboneoftheurbanrailtransitmulti-level,multi-functionalpublictransportsystem,thusprotectingtheregionalpositionandachieve //数据长度 Buffer:array[0..DATA_BUFSIZE-1]ofchar; //数据信息,包括数据头信息 end;这种结构当我们调用GetQueuedC
5、ompletionStatus函数的时候,用该函数的第4个参数来返回这个结构,这样一来我们就不用定义2个结构来处理不知道大家是否还记得在我的BLOG中关于粘包的文章(我们暂且不说它是否应该叫这个名字)。关于粘包的造成原理我这里就不讲述了,如有需要可以参看我的BLOG。这里只是说明一下,粘包的处理是我们将通过IOCP得到的数据,和这个套接字上次处理并剩余的数据合并在一起,看新合并后的数据包中是否包含一个完整的数据结构,如果包含则进行相关处理,并将处理后的剩余数据进行再次判断,反复如此。一般我们会将这个合并的数据放在一个TList链表中,有的时候为了加
6、快它的查找速度,我们会将它放在一个HASH表中,以套接字做为KEY。自然放在HASH表中的速度要比放在单纯的链表中快一些。可是我们有没有想过直接放在上面的这个IO结构中呢?也就是说将粘包处理的数组放在IO结构中,这样当GetQueuedCompletionStatus返回的时候就会直接将数据进行粘包处理,又可以免去一次的数据查找过程。这样一来,上面的数据结构就变成了: //IO结构 PIOData=^TIOData; TIOData=record Overlapped:OVERLAPPED; DataBuf:TWSABUF; Socke
7、t:TSocket; //套接字 OperationType:TOperation; //操作类型 BufferLen:Integer; //数据长度 Buffer:array[0..DATA_BUFSIZE-1]ofchar; //数据信息,包括数据头信息 SpareBuffer:array[0..2*DATA_BUFSIZE-1]ofchar; //处理粘包数组 SpareBufferlen:Integer; 5.1-9,
8、,services,andmakethecitymoreattractive,strengtheningpublictra
此文档下载收益归作者所有