高性能大容量SOCKET并发(四):粘包、分包、解包 本帖最后由 SQLDebug_Fan 于 2012-09-05 23:11:17 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 支持楼主的分享.数据包未全部到达,数据包长度<SizeOf(IORecvBuf)时,直接WSARecv剩余部分,当收完时,直接用@IORecvBuf和长度通知用户层,长度之后的剩余部分(下一个包了)判断长度,如果下一个包的长度<=SizeOf(IORecvBuf)减Offset,同样直接WSARecv后面的部分,如果情况未明(下一个包不足4字节)或者长度>SizeOf(IORecvBuf)减Offset 并且小于SizeOf(IORecvBuf) 需要复制剩余部分到 IORecvBuf 头,Offset归0,如果长度直接大于(IORecvBuf),判断大小及有效性后,Pool上申请这块内存(新数据包的大小),复制收到的部分,用申请的这块内存,并设置好Offset后,WSARecv剩余部分。这样作的好处是复制数据的次数明显小于不复制数据的次数,如果项目中规定好数据包大小,绝大多数情况不需要在本层复制数据,即使复制也只复制了前面一部分你用的是流,没得选,只能复制 webbrowser递归遍历网页元素问题求教! 裸尽分求:关于多线程sleep的问题! 如何用Delhpi删除指定程序的所有快捷方式 关于参照窗体的问题 处理界面的结构过程中遇到了边界问题,大家看看解决方法! 做企业ERP,B/S C/S 到底誰更高明?各有什么优缺点?各有什么高明的地方?比较一下? 请写一段最简单的 客户端和服务端 收发文件的代码。 求高手解线程函数返回值的问题。现在返回值为空。 ace文件? Delphi6的 Help怎么安装? 如何把TIdHttp与某个IE进程关联? delphi如何物理删除DBF数据
数据包未全部到达,数据包长度<SizeOf(IORecvBuf)时,直接WSARecv剩余部分,当收完时,直接用@IORecvBuf和长度通知用户层,长度之后的剩余部分(下一个包了)判断长度,如果下一个包的长度<=SizeOf(IORecvBuf)减Offset,同样直接WSARecv后面的部分,如果情况未明(下一个包不足4字节)或者长度>SizeOf(IORecvBuf)减Offset 并且小于SizeOf(IORecvBuf) 需要复制剩余部分到 IORecvBuf 头,Offset归0,
如果长度直接大于(IORecvBuf),判断大小及有效性后,Pool上申请这块内存(新数据包的大小),复制收到的部分,用申请的这块内存,并设置好Offset后,WSARecv剩余部分。
这样作的好处是复制数据的次数明显小于不复制数据的次数,如果项目中规定好数据包大小,绝大多数情况不需要在本层复制数据,即使复制也只复制了前面一部分
你用的是流,没得选,只能复制