读书人

socket如何避免chunked数据

发布时间: 2013-01-19 11:41:36 作者: rapoo

socket如何处理chunked数据?
先写几个前置说明:
1.不懂C++,请勿直接上代码,给个思路就行,来这边问是这边接触的人应该多些,而且socket思路基本相同的
2.全部读取然后一并处理我能做到,但现在考虑大数据量的情况,想边接收边处理,脑子就打结了
3.chunked数据就是指 返回Transfer-Encoding: chunked的情况,各位应该都了解了,这个就不细说了


buffer=4096
get到数据存入内存IO,可看作tempData,满足>2048000就写入文件,清空tempData,这部分搞定了
如果不写入文件,全部放进tempData不难处理,又或者写入临时文件,等接收完成后一次读出处理也不难,但考虑大数据(虽然目前大数据遇到chunked几率不高,但还是要考虑在内)
现在希望在写入tempData前,提取chunked内每块的数据再写入

但buffer未必就是一个完整的chunked,所以要跨buffer处理,前一个读取残留数据要留给下一个buffer合并处理。正如chunked数据结构,因为是每段chunked是变长的,每次都要定位'\r\n'读取并计算长度,所以一下就转不过弯了
[解决办法]
http://blog.csdn.net/wallwind/article/details/7747566
当时我处理过。。。楼主看一下吧
[解决办法]

引用:
没看懂那段代码,抱歉,不是这家的
感觉你是用\r\n视作换行,然后按行读取么?单数行就是长度,双数行就是数据,这样?

但我遇到数据块里面有\r\n的情况,我仔细看过,那个\r\n确实是chunked数据的一部分,处于数据的中段


引用:http://blog.csdn.net/wallwind/article/detail……


这是http协议吧

我没实际处理过http协议,但是我个人觉得所有的发送包接收包都可以用类似的方式解决

1、楼主可以在发送内容的一开始自己加上当前内容的长度
这样就不需要依赖\r\n来判断了
比如你的chunked是2000字节,你在2000字节前面再加4字节,这个4字节里面填2000,也就是说chunked你发的内容实际上是2004个字节,解包的时候按照这个长度来读

2、转义,这个就比较麻烦了,因为你的\r\n是有特殊含义的,表示内容结束的,那么当你需要发的内容数据里面本身就包含\r\n的时候,就将其改成比如\\r\\n,但是这种转义始终需要你找到一个字符串是绝对不会出现在内容当中的才可以
[解决办法]
有种东西叫做“状态机”,解Multipart form表单,解chunk body,都一样无脑,所有的web server都必须是状态机O(n)完成解析。
[解决办法]
base64编码?

不知道有多少前人掉在TCP Socket
send(人多)send(病少)send(财富)
recv(人多病)recv(少财富)
陷阱里面啊!
http://topic.csdn.net/u/20120210/09/51109ed0-07b9-41f2-b487-a51597f2ca01.html

读书人网 >C++

热点推荐