- 1、本文档共5页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
cudp协议拆包封包
蛙蛙教你解析网络包
摘要:做网络应用,封包,解包是家常便饭,但如何做到准确、稳定而且性能好,却不太容易做到,这次和大家分享一下我在解析网络包上的经验。
思路:设计一个网络协议,一般都会分包,一个包就相当于一个逻辑上的命令。1、如果我们用udp协议,省事的多,一次会收到一个完整的包,但UDP不可靠,顺序也不能保证,当然像QQ对UDP封装的很好,模拟了TCP的可靠性。网上也有一些封装好的可靠的UDP组件,大家用的话可以找找。关于用什么协议好这个问题,本贴不讨论。2、如果我们用TCP协议不是长连接,像HTTP(不考虑KeepAlive)那样,一个连接上只发送一个包,我们也会很清晰的区分出接受到的每一个包。3、还有就是我们还用TCP长连接,但每次发送固定长度的包,如果要发送的数据长度不够就用\0补齐,如果大于固定长度,就分成几个发,这个也很简单实用。4、再有就是一个包有特定的开始和结尾,比如包头是bof包尾是eof,我们在可以从头读到尾,并把一个一个的包放入队列,由处理线程去处理。5、再有一种就是每个包有固定长度的header,这个header里包含一个包的长度信息,我们可以先从头里读出长度信息,然后再借着读这么长的数据,完了这就是一个包。
关于封包的几种类型我就想到这么多,其中的利弊大家一看便知,我就不忽悠了,本文主要介绍最后一种方式,好多网络协议用的都是这种,包括CMPP协议,我们自己设计协议的时候一般不用像CMPP协议那样,因为二进制协议虽然虽然节省网络流量,但可读性不好。出问题,抓个包分析起来太麻烦。我们可以用.net自带的序列功能把要发送的类序列化成XML字符串发送出去,这多好看呀。
由于Socket缓冲区设置及其他的原因,Socket在接受数据的时候有时候不能完整的收到一个包,就是你读出包的长度后,可能不能一次就读取这么多数据。而如果读个半截儿的包就用UTF8Encoding等来解析,会解析出乱码的,我们这里用Encoding.UTF8.GetDecoder()来对包进行成块儿的解析,它就是用来做这种事情的。
下面就来看一下代码,代码的注释很全,演示了一个包从发到接受、解析的全过程,其中接受的过程没有一次收全所有的包,而是收了好几次,但我们最终还是成功的解析了收到的包。
?
?
public?static?void?UnPack(){????//1、声明通过socket发送的字符串????string?toSendStringBySocket?=?娃娃士大夫%#¥%My?name?is?蛙蛙王子!!;????//2、转换成utf-8字节数组????byte[]?bsInput?=?Encoding.UTF8.GetBytes(toSendStringBySocket);????//3、计算要发送的字节数组的长度,并写到第一块儿字节数组的开头????//一般协议设计里都有一个长度的Header,这里就是写这个Header????int?inputBytesCount?=?bsInput.Length;????byte[]?bs1?=?new?byte[4?+?3];?//4是一个int的长度,3是底一块字节数组除了Header剩余的大小????Buffer.BlockCopy(BitConverter.GetBytes(inputBytesCount),?0,?bs1,?0,?4);????//4、把要发送的字节数组拆分成3块儿发出去,因为socket在接受字节数组的时候????//也可能半截半截儿的接收,我们就是要模拟这种效果下的拆包,因为第一块包写了????//一个4个字节的Header,而第一块字节数组长度是7,所以再写三个字节长度的数据????int?offSet?=?0;????Buffer.BlockCopy(bsInput,?offSet,?bs1,?4,?3);????offSet?+=?bs1.Length?-?4;????//5、写第二块儿数据????byte[]?bs2?=?new?byte[8];????Buffer.BlockCopy(bsInput,?offSet,?bs2,?0,?bs2.Length);????offSet?+=?bs2.Length;????//6、写第三块儿数据,我们这里模拟在最后一块数据的末尾加一些乱七八糟的数据????//这些乱七八糟的数据有可能是下一个包的header。????byte[]?bs3?=?new?byte[bsInput.Length?-?offSet?+?4];????Buffer.BlockCopy(bsInput,?offSet,?bs3,?0,?bsInput.Length?-?o
您可能关注的文档
- 2015四川公务员申论模拟题及答案低头族.doc
- 2015初三化学各章节知识点(改).doc
- 2015国家公务员申论热点预测兰州水污染的思考.doc
- 2015从化事业单位考试申论模拟题地质灾害.doc
- 2015届高三理科综合能力测试(2014.9.22).doc
- 2015届高考地理必备考点之对流层的受热过程.doc
- 2015年3月10日国家公务员面试真题(国家气象局).doc
- 2015年5月高三化学考前训练【金属元素】.doc
- 2015年一级建造师考试《建筑工程》真题及答案解析.doc
- 2015初三化学丰台一模及答案.docx
- 金融产品2024年投资策略报告:积极适应市场风格,行为金融+机器学习新发现.pdf
- 交运物流2024年度投资策略:转型十字路,峰回路又转(2023120317).pdf
- 建材行业2024年投资策略报告:板块持续磨底,重点关注需求侧复苏.pdf
- 宏观2024年投资策略报告:复苏之路.pdf
- 光储氢2024年投资策略报告:复苏在春季,需求的非线性增长曙光初现.pdf
- 公用环保2024年投资策略报告:电改持续推进,火电盈利稳定性有望进一步提升.pdf
- 房地产2024年投资策略报告:聚焦三大工程,静待需求修复.pdf
- 保险2024年投资策略报告:资产负债匹配穿越利率周期.pdf
- 政策研究2024年宏观政策与经济形势展望:共识与分歧.pdf
- 有色金属行业2024年投资策略报告:新旧需求共振&工业原料受限,构筑有色大海星辰.pdf
文档评论(0)