这几天在在重新DIOCP3,基本工作已经初步完成,进入测试阶段,今天加入排队投递,本认为是个很简单的工作,稍微不注意,留了两个坑,调了7,8个小时,刚刚总算找到问题,记录一下,

关于排队投递的流程

DIOCP开源项目-DIOCP3重写笔记-1-LMLPHP

这是投递一个TIocpSendRequest的流程,投递开始,投递一块数据,最大50K,如果超过50K则分批进行投递。流程是没错,我刚开始的写法是:

DIOCP开源项目-DIOCP3重写笔记-1-LMLPHP

其中InnerPostRequest是投递发送数据到iocp队列中去,投递完成后然后增加内存块的Postion,以便于下次继续投递。看上去貌似没什么问题。如果网络情况相当好的情况下面,特别是本机,投递后另外线程马上相应完成事件<在里面进行判断的时候FPosition时,还木有累加上去,杯具就这么一点点产生了>。既然知道了原因,就好解决问题了。

 

修改下,这边不处理Postion的增加,在HandleResponse中处理。

DIOCP开源项目-DIOCP3重写笔记-1-LMLPHP

在发送完数据后,再进行FPostion的增加,然后判断,是否还有剩余数据需要发送。终于把这坑填好了。

 

还是那句话:"并发设计:决不要假设任何代码会连续执行”

05-11 11:35