黄岩建设局网站,手机如何建设网站,wordpress中文设置,深圳网络推广代理1#xff0c;如何处理乱序。 按照投递Read的次序#xff0c;收到ReadComplete时#xff0c;看收到的buffer中序号跟连接中的序号是否相等。 不如用例子表示#xff1a;b1#xff0c;b2表示两个Read请求用的buffer。连接Context中序列号为0#xff0c;b1保存的序号为0如何处理乱序。 按照投递Read的次序收到ReadComplete时看收到的buffer中序号跟连接中的序号是否相等。 不如用例子表示b1b2表示两个Read请求用的buffer。连接Context中序列号为0b1保存的序号为0b2保存的序号为1.p2p1表示先收到第二个Read的反馈p2对应的buffer为b2里面的序号为1而连接Context中的序号还是0所以暂时不处理将buffer缓冲起来。等p1到达p1对应的buffer为b1里面的序号为0而连接中的序号是0处理再将连接序号1由于处理是在一个while循环中继续查找序号为1的buffer找到后处理。如此这般就能实现对buffer的乱序处理。 if(m_bReadInOrder) pOverlapBuffGetNextReadBuffer(pContext,pOverlapBuff); while(pOverlapBuff!NULL) { //TRACE(R %i\r\n,pOverlapBuff-GetSequenceNumber()); // Mark that we are Using the buffer.. pOverlapBuff-Use(dwIoSize); ProcessPackage(pContext,dwIoSize,pOverlapBuff); IncreaseReadSequenceNumber(pContext); pOverlapBuffNULL; if(m_bReadInOrder) pOverlapBuffGetNextReadBuffer(pContext); } } 2如何提升读取性能。 一个新的客户端连上后先通过ARead投递0字节IOInitialize事件给IOCP端口。 当IOCP端口上收到该IOInitialize事件后自产自销又干了这个 AZeroByteRead(pContext,pOverlapBuff); // 投递(PostQueuedCompletionStatus)一个0字节IOZeroByteRead事件。 // m_iNumberOfPendlingReads1 by default. for(int i0;im_iNumberOfPendlingReads;i) { EnterIOLoop(pContext); // One for each Read Loop ARead(pContext); // 投递(PostQueuedCompletionStatus)n个0字节IORead事件。 } 当IOCP端口上收到IOZeroByteRead事件后会将buffer类型设置成IOZeroReadCompleted触发读取(WSARecv)缓冲区长度设为0的包。 当IOCP端口上收到IOZeroReadCompleted事件后会重新调用AZeroByteRead()如此循环往复。 在IOCP端口上收到IORead事件后将buffer类型设置成IOReadCompleted然后动真格的触发读取(WSARecv)缓冲设为真正buffer长度。 当IOCP端口上收到IOReadCompleted事件后继续调用ARead(pContext)如此循环往复保持m_iNumberOfPendlingReads个读请求。 1上面连续投递n个是为了提高吞吐率当正在处理一个数据包时还可以同时接收数据。 2没有直接投递IOReadCompleted而是先Post IORead马上再WSARecv IOReadCompleted是为了将大任务分解成小任务符合IOCP的特点。 3循环投递IOZeroByteRead是为了将投递的IOReadCompleted缓冲区解锁。看下面链接 http://topic.csdn.net/u/20100209/10/0271d94f-0785-427b-85f5-51fe7417d22d.html 3如何处理分包。 看ProcessPackage代码即可。 4如何处理Context非法访问。 在一个连接中你知道要关闭该连接并关闭但同时有几个IORead请求已经发出不可避免的它们马上返回IOCP消息但你已经不能再访问消息中的Context对象了。 解决办法给Context增加计数器当最后一个IORead返回不论成功或失败时计数器肯定等于0这时才能释放资源。 但我的疑问是IOCP请求和IOCP事件是一一对应的吗客户端主动关闭时会不会发生多余的IOCP事件。看代码看TriggerRecv的时机对不对。 5有害的大包设计。 6转发服务器只要读取时处理乱序、分包发送不必关心。转载于:https://www.cnblogs.com/tara/archive/2012/04/16/2451868.html