LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1012|回复: 7

recv()函数收到的数据正确性问题

[复制链接]
发表于 2008-8-7 11:48:16 | 显示全部楼层 |阅读模式
只要recv()函数正确返回,是否就可以认为收到的数据包就一定正确的了呢?我用的是socket( AF_INET, SOCK_STREAM, IPPROTO_TCP )。
如果答案是否定的,为什么TCP连接没起作用,如何判断包是正确无误的呢?谢谢
 楼主| 发表于 2008-8-7 12:06:31 | 显示全部楼层
我要拿的是一个网页,收到返回的头信息后,读取其中的正文长度,并且做了拷贝到buf的长度和正文长度的判断。当两个长度一致时,可否认为正文一定是正确的?
回复 支持 反对

使用道具 举报

发表于 2008-8-7 15:27:33 | 显示全部楼层
1、在理论上不一定正确, 说不定你的内存崩了一块也可以让数据坏掉了。但实际上, 你可以认为是正确的。
2、不知道你想问啥, 难道想知道 HTTP-KeepAlive的选项?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-8-7 18:49:52 | 显示全部楼层
想知道是不是只要recv()返回的值跟Content-Length的一致,就可以判断本次收到的网页就是正确无误的
回复 支持 反对

使用道具 举报

发表于 2008-8-7 20:55:23 | 显示全部楼层
我觉得,基本上,很难做到content-length跟recv返回值一样
头和正文一般都在一个包里,除非你在拿到content-length之前是一个字节一个字节recv的,直到得到content-length后再一次收回来。
谁会这么做呢
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-8-8 08:51:22 | 显示全部楼层
哦,我是拿完包之后找到content-length,然后再将统计的正文长度跟content-length做比较的,没有描述清楚,不好意思,呵呵。

是不是这样比较后就可以认定拿到的正文数据就是正确的了呢?
因为不仅要拿网页,还要拿图片,发现有些图片拿下来后打不开。就怀疑会不会因为虽然它们长度一样,但是实际数据会因网络状况而还是有出入的?
回复 支持 反对

使用道具 举报

发表于 2008-8-8 13:24:40 | 显示全部楼层
打不开的图片,大小方面有没有什么特点?比如都是大于某一个数值
回复 支持 反对

使用道具 举报

发表于 2008-8-12 02:04:39 | 显示全部楼层
TCP链接的recv拿到的包可以认为是正确的,但是发送端的程序如果有bug,就有可能发送错误的数据。Server的缓冲区覆盖bug是很常见的。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表