WEB开发网
开发学院软件开发VC 一个简单的完成端口(服务端/客户端)类 阅读

一个简单的完成端口(服务端/客户端)类

 2009-02-25 19:59:50 来源:WEB开发网   
核心提示: 获取这种解决方法的更多信息,请查阅源码,一个简单的完成端口(服务端/客户端)类(7),仔细查看IOCPS类中如下的函数:GetNextSendBuffer (..) and GetNextReadBuffer(..), to get the ordered send or receive

获取这种解决方法的更多信息,请查阅源码,仔细查看IOCPS类中如下的函数:

GetNextSendBuffer (..) and GetNextReadBuffer(..), to get the ordered send or receive buffer.

IncreaseReadSequenceNumber(..) and IncreaseSendSequenceNumber(..), to increase the sequence numbers.

3.6.3 异步等待读 和 字节块包处理问题

最通用的服务端协议是一个基于协议的包,首先X个字节代表包头,包头包含了详细的完整的包的长度。服务端可以读包头,计算出需要多少数据,继续读取直到读完一个完整的包。当服务端同时只处理一个异步请求时工作的很好。但是,如果我们想发挥IOCP服务端的全部潜能,我们应该启用几个等待的异步读事件,等待数据到达。这意味着几个异步读操作是不按顺序完成的,通过等待的读事件返回的字节块流将不会按顺序处理。而且,一个字节块流可以包含一个或几个包,也可能包含部分包,如下图所示:

一个简单的完成端口(服务端/客户端)类

这个图形显示了部分包(绿色)和完整包(黄色)是怎样在不同字节块流中异步到达的。

这意味着我们必须处理字节流来成功的读取一个完整的包。而且,我们必须处理部分包(图表中绿色的部分)。这就使得字节流的处理更加困难。这个问题的完整解决方法在IOCPS类的ProcessPackage(…)函数中。

3.6.4 访问非法问题

这是一个较小的问题,代码设计导致的问题更胜于IOCP的特定问题。假设一个客户端连接已经关闭并且一个I/O请求返回一个错误标志,然后我们知道客户端已经关闭。在参数CompletionKey中,我们传递了一个指向结构ClientContext的指针,该结构中包含了客户端的特定数据。如果我们释放这个ClientContext结构占用的内存,并且同一个客户端处理的一些其它I/O请求返回了错误代码,我们通过转换参数CompletionKey为一个指向ClientContext结构的指针并试图访问或删除它,会发生什么呢?一个非法访问出现了!

上一页  2 3 4 5 6 7 8 9 10  下一页

Tags:一个 简单 完成

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接