本帖最后由 SQLDebug_Fan 于 2012-09-05 23:11:17 编辑

解决方案 »

  1.   

    支持楼主的分享.
    数据包未全部到达,数据包长度<SizeOf(IORecvBuf)时,直接WSARecv剩余部分,当收完时,直接用@IORecvBuf和长度通知用户层,长度之后的剩余部分(下一个包了)判断长度,如果下一个包的长度<=SizeOf(IORecvBuf)减Offset,同样直接WSARecv后面的部分,如果情况未明(下一个包不足4字节)或者长度>SizeOf(IORecvBuf)减Offset 并且小于SizeOf(IORecvBuf) 需要复制剩余部分到 IORecvBuf 头,Offset归0,
    如果长度直接大于(IORecvBuf),判断大小及有效性后,Pool上申请这块内存(新数据包的大小),复制收到的部分,用申请的这块内存,并设置好Offset后,WSARecv剩余部分。
    这样作的好处是复制数据的次数明显小于不复制数据的次数,如果项目中规定好数据包大小,绝大多数情况不需要在本层复制数据,即使复制也只复制了前面一部分
    你用的是流,没得选,只能复制